有没有一种方法可以匹配文件中的字符串,并在字符串匹配后在下一行上打印/追加另一个文件的内容(单行)

时间:2018-12-28 15:01:51

标签: awk

我正在尝试匹配文件中的字符串,并在字符串匹配后打印/附加另一个文件的内容

我有包含单行pleaseaddme的文件“ addthis”:

pleaseaddme

还有第二个文件“ tothis”,其中包含两行[one]和[two],如下所示:

[one]

[two]

我尝试过组合,结果与我的预期结果很接近:

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

结果:

[one]please add me

[two]

我想将[请添加我]添加到[one]之后的新行中 像这样:

[one]
please add me
[two]

这也只是打印到屏幕上,而不是打印到文件“ tothis”中

我已经尽力尝试了许多变体

3 个答案:

答案 0 :(得分:1)

print

首先您应该转义nilawk '/\[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

至于更改,您仍然可以重定向到临时文件,以后再替换文件。

答案 1 :(得分:1)

您可以尝试:

>> 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

答案 2 :(得分:0)

鉴于我在Mac上的awk版本可以正常工作

  
    

awk'/ [one] / {getline s <“ addthis”; $ 0 = $ 0“ \ n” s;} / [^ \ s] + / {print}'tothis> fckmack && mv fckmack tothis