Добавить текст в конце каждой строки


93

Я в командной строке Linux, и у меня есть файл с

127.0.0.1
128.0.0.0
121.121.33.111

я хочу

127.0.0.1:80
128.0.0.0:80
121.121.33.111:80

Я помню, что мои коллеги использовали для этого sed, но после прочтения руководства по sed все еще не ясно, как это сделать в командной строке?


2
Отличный вопрос, и мне нравится, как вы его сформулировали.
Энтони Ратледж,

Ответы:


141

Вы можете попробовать использовать что-то вроде:

sed -n 's/$/:80/' ips.txt > new-ips.txt

При условии, что ваш формат файла такой, как вы описали в своем вопросе.

Команда s///подстановки сопоставляет ( находит ) конец каждой строки в вашем файле (используя $символ), а затем добавляет ( заменяет ) :80до конца каждой строки. ips.txtФайл представляет собой входной файл ... и new-ips.txtваш вновь созданный файл ( конечный результат ваших изменений. )


Кроме того, если у вас есть список IP-адресов, к которым уже прикреплены номера портов (как отметил Влад и предоставил aragaer ), вы можете попробовать использовать что-то вроде:

sed '/:[0-9]*$/ ! s/$/:80/' ips.txt > new-ips.txt

Так, например, если ваш входной файл выглядел примерно так (обратите внимание на :80) :

127.0.0.1
128.0.0.0:80
121.121.33.111

Окончательный результат будет выглядеть примерно так:

127.0.0.1:80
128.0.0.0:80
121.121.33.111:80

1
Хорошо, просто уточняю ... Может быть, должно быть условие для исключения строк, где порт уже существует.
Влад

3
sed '/:[0-9]*$/ ! s/$/:80/'
aragaer

3
Добавьте это к своему собственному ответу. Предложение исключить строки с портами уже есть в комментариях, я просто написал точную команду.
aragaer

3
Если в файле есть терминаторы CRLF, :80они будут добавлены в начало следующей строки. При dos2unixнеобходимости сначала используйте файл.
djnz0feh

1
это -nнеобходимо? вероятно, не для большинства пользователей.
Джим

17

Краткая версия команды sed :

sed -i s/$/:80/ file.txt

Пояснение:

  • sed s Tream ред itor
    • -i i n-place (редактировать файл на месте)
    • s s ubstitution команда
    • /replacement_from_reg_exp/replacement_to_text/ заявление
    • $соответствует концу строки ( replace_from_reg_exp )
    • :80текст, который вы хотите добавить в конец каждой строки ( replace_to_text )
  • file.txt имя файла


12

Если вы хотите добавить текст в конце каждой строки на месте (в том же файле), вы можете использовать -iпараметр, например:

sed -i'.bak' 's/$/:80/' foo.txt

Однако -iопция является нестандартным расширением Unix и может быть доступна не во всех операционных системах.

Итак, вы можете использовать ex(что эквивалентно vi -e/ vim -e):

ex +"%s/$/:80/g" -cwq foo.txt

который будет добавляться :80к каждой строке, но иногда может добавлять его к пустым строкам.

Поэтому лучший способ - проверить, действительно ли строка содержит какое-либо число, а затем добавить его, например:

ex  +"g/[0-9]/s/$/:80/g" -cwq foo.txt

Если файл имеет более сложный формат, рассмотрите возможность использования правильного регулярного выражения вместо [0-9].


1

Используя текстовый редактор, проверьте наличие ^M(Control-M или возврата каретки) в конце каждой строки. Вам нужно сначала удалить их, а затем добавить дополнительный текст в конце строки.

sed -i 's|^M||g' ips.txt
sed -i 's|$|:80|g' ips.txt

0
  1. Вы также можете добиться этого, используя технику обратной ссылки

    sed -i.bak 's/\(.*\)/\1:80/' foo.txt
    
  2. Вы также можете использовать с awk вот так

    awk '{print $0":80"}' foo.txt > tmp && mv tmp foo.txt
    

-1

sed -i 's / $ /, / g' foo.txt

Я делаю это довольно часто, чтобы добавить запятую в конец вывода, чтобы я мог просто скопировать и вставить его в массив Python (или ваш любимый язык)

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.