2013-04-12 4 views
50

Я в командной строке 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 manual все еще не понятно, как это сделать в командной строке?

ответ

80

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

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

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

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


Кроме того, если у вас есть список номеров IP, которые случаются иметь номера портов прилагается уже (как было отмечено Vlad и как дано 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 
+0

Будет ли он добавлять ': 80' в строку, где': 80' уже добавлен? – Vlad

+0

@ Vlad Да; но в соответствии с введенным примером ввода OPs ... в списке IP-адресов не должно быть номеров портов. :) Даже если бы ... OP мог просто запустить другой sed 's ///' заранее, чтобы вынуть любые номера портов в конце каждой строки. – summea

+1

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

8

Если вы хотите добавить текст в конце каждой строки в месте (в том же файле), вы можете использовать -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].

0

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

sed -i 's|^M||g' ips.txt 
sed -i 's|$|:80|g' ips.txt 
Смежные вопросы