我正在尝试匹配文件中的字符串,并在字符串匹配后打印/附加另一个文件的内容
我有包含单行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”中
我已经尽力尝试了许多变体
答案 0 :(得分:1)
print
首先您应该转义nil
和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
。
至于更改,您仍然可以重定向到临时文件,以后再替换文件。
答案 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