Додайте текст у кінці кожного рядка


92

Я працюю в командному рядку 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

@Vlad Так; але згідно з операційними даними, наведеними на прикладі введення ... у списку IP-адрес не повинно бути номерів портів. :) Навіть якби такі були ... OP міг просто запустити ще один s///заздалегідь, щоб витягнути будь-які номери портів у кінці кожного рядка.
summea

1
Гаразд, лише уточнюю ... Можливо, має бути умова виключити лінії, де порт вже існує.
Влад

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

3
Додайте його до власної відповіді. Пропозиція виключити рядки з портами вже є тут у коментарях, я щойно написав точну команду.
aragaer

3
Якщо у файлі є завершувачі CRLF, символ :80буде додано на початок наступного рядка. dos2unixСпочатку використовуйте файл, якщо потрібно.
djnz0feh

16

Стисла версія команди sed :

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

Пояснення:

  • sed s Tream ред itor
    • -i я на місці (редагувати файл на місці)
    • s s команда введення
    • /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 (або ваш улюблений lang)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.