Есть ли способ сопоставить строку в файле и распечатать / добавить содержимое другого файла (одной строки) на следующей строке после совпадения строки - PullRequest
0 голосов
/ 28 декабря 2018

Я пытаюсь сопоставить строку в файле и распечатать / добавить содержимое другого файла после совпадения строки

У меня есть файл "addthis", содержащий одну строку pleaseaddme:

pleaseaddme

и у меня есть второй файл "tothis", содержащий две строки [одну] и [две] примерно так:

[one]

[two]

Я пробовал комбинации, приводящие к следующему, что близко к желаемому результату:

awk '/\[one\]/ { printf $0; getline < "addthis" }1' tothis

Результат:

[one]please add me

[two]

Я бы хотел, чтобы «добавьте меня» добавили в новую строку после [одного], например так:

[one]
please add me
[two]

Кроме того, это только печать на экран, а не в файл "tothis"

Пробовал многочисленные варианты, насколько это возможно,

Ответы [ 3 ]

0 голосов
/ 28 декабря 2018

Вы можете попробовать:

>> awk '/\[one\]/ {getline s < "addthis"; $0=$0 "\n" s;} /[^\s]+/{print}' tothis
[one]
pleaseaddme
[two]

Если вы хотите заменить в своем файле, вы должны добавить -i inplace:

>> awk -i inplace '/\[one\]/ {getline s < "addthis"; $0=$0 "\n" s;} /[^\s]+/{print}' tothis
>> cat tothis
[one]
pleaseaddme
[two]

Если вы не можете использовать -i inplace, вы должны добиться того же с:

>> awk '/\[one\]/ {getline s < "addthis"; $0=$0 "\n" s;} /[^\s]+/{print}' tothis > fckmack && mv fckmack tothis
0 голосов
/ 28 декабря 2018

Учитывая мою версию awk на Mac, это работает

awk '/ [one] / {getline s <"addthis";$ 0 = $ 0 "\ n" s;} / [^ \ s] + / {print} 'к этому> fckmack && mv fckmack к этому

0 голосов
/ 28 декабря 2018
awk '/\[one\]/ {getline var< "addthis"; $0 = $0 ORS var }1' tothis
#=> [one]
#=> pleaseaddme
#=> [two]

Прежде всего вы должны экранировать [ и ].
, а затем прочитать файл в переменную и "добавить" его в текущую строку.

Еще один способ сделать это может быть:

awk '/\[one\]/ {print; getline var< "addthis"; print var; next }1' tothis

С вашей собственной попытки, на самом деле изменение printf на print будет работать:

awk '/\[one\]/ { print $0; getline < "addthis" }1' tothis
#=> [one]
#=> pleaseaddme
#=> [two]

Поскольку printf не будет печатать ORS, а print будет.
Однако в этом случае $0 является излишним, поскольку печать без параметра будет печатать $0 по умолчанию.

Что касаетсяизменить место, вы все еще можете перенаправить во временный файл и заменить файл позже.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...