Як додати в кінець рядки, що містять візерунок за допомогою sed або awk?


89

Ось приклад файлу:

somestuff...
all: thing otherthing
some other stuff

Що я хочу зробити, це додати до рядка, який починається all:так:

somestuff...
all: thing otherthing anotherthing
some other stuff

Відповіді:


166

Це працює для мене

sed '/^all:/ s/$/ anotherthing/' file

Перша частина - це шаблон для пошуку, а друга частина - звичайна заміна sed, що використовується $для кінця рядка.

Якщо ви хочете змінити файл під час процесу, використовуйте -iопцію

sed -i '/^all:/ s/$/ anotherthing/' file

Або ви можете перенаправити його в інший файл

sed '/^all:/ s/$/ anotherthing/' file > output

Просто додавши щось призводить до нового рядка, заміна - правильний шлях.
жи

10

Це має працювати для вас

sed -e 's_^all: .*_& anotherthing_'

За допомогою команди s (заміни) ви можете шукати рядок, який задовольняє регулярному виразу. У наведеній вище команді &означає відповідний рядок.


9

Ви можете додати текст до $0awk, якщо він відповідає умові:

awk '/^all:/ {$0=$0" anotherthing"} 1' file

Пояснення

  • /patt/ {...}якщо рядок відповідає шаблону, заданому patt, виконайте дії, описані всередині {}.
  • У цьому випадку: /^all:/ {$0=$0" anotherthing"}якщо рядок починається (представлений ^) з all:, додайте anotherthingдо рядка.
  • 1як істинна умова ініціює дію за замовчуванням awk: друк поточного рядка ( print $0). Це трапляється завжди, тому буде надруковано оригінальний рядок або модифікований.

Тест

Для заданого вводу він повертає:

somestuff...
all: thing otherthing anotherthing
some other stuff

Зверніть увагу, що ви також можете надати текст для додавання у змінну:

$ awk -v mytext=" EXTRA TEXT" '/^all:/ {$0=$0mytext} 1' file
somestuff...
all: thing otherthing EXTRA TEXT
some other stuff

На Solaris ви отримаєте помилку:awk: can't set $0
закінчення

@ceving тоді ви можете використовувати, /usr/xpg4/bin/awkщо є "хорошим" awk.
Fedorqui 'SO prestani шкодити'


6

Ось ще одне просте рішення із використанням sed.

$ sed -i 's/all.*/& anotherthing/g' filename.txt

Пояснення:

all. * означає всі рядки, що починаються з "all".

& представляють збіг (тобто повний рядок, який починається на "все")

потім sed замінює перше на пізніше і додає слово "інше"


3

Рішення з awk:

awk '{if ($1 ~ /^all/) print $0, "anotherthing"; else print $0}' file

Просто: якщо рядок починається з allдруку рядка плюс "інше", інакше надрукуйте лише рядок.


4
Ви можете скоротити це до:awk '$1=="all:" {$(NF+1)="anotherthing"} 1'
glenn jackman

2
@Prometheus, сценарій awk складається з condition {actions}пар. Якщо значення conditionопущено, дії виконуються для кожного запису. Якщо значення {actions}опущено, а умова має значення true (що стосується числа 1), то за замовчуванням дія буде надруковано поточний запис.
glenn jackman
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.