戰略經濟對話的簡單替代上一個極好的工具一行,其他的只是使用awk。如果你在sed中使用除s,g和p之外的任何東西(帶-n),那麼你正在使用錯誤的工具和語言結構,這些工具和語言結構在20世紀70年代中期awk被髮明時變得過時了。
有很多方法可以做到這一點。這裏有一個:
$ cat file1
<plist>
<dict>
.
.
<key>abc</key>
<dict>
.
.
</dict>
.
.
</dict>
</plist>
。
$ cat file2
now is the
winter of
our discontent
。
$ awk 'NR==FNR{extra = extra $0 RS; next} {print} /<dict>/ && ++count==1{printf "%s", extra}' file2 file1
<plist>
<dict>
now is the
winter of
our discontent
.
.
<key>abc</key>
<dict>
.
.
</dict>
.
.
</dict>
</plist>
想要在第二次出現dict而不是第一次後打印?只要改變==1
到==2
:
$ awk 'NR==FNR{extra = extra $0 RS; next} {print} /<dict>/ && ++count==2{printf "%s", extra}' file2 file1
<plist>
<dict>
.
.
<key>abc</key>
<dict>
now is the
winter of
our discontent
.
.
</dict>
.
.
</dict>
</plist>
要搜索跨越多個行,而不是一個模式的第N次出現的模式?下面是GNU awk用於多字符RS和gensub()的一種方法:
$ awk -v RS='^$' 'NR==FNR{extra=$0;next} {print gensub(/<plist>[[:space:]]+<dict>\n/,"&"extra,"")}' file2 file1
<plist>
<dict>
now is the
winter of
our discontent
.
.
<key>abc</key>
<dict>
.
.
</dict>
.
.
</dict>
</plist>
awk的所有微不足道的東西。
要更新任何UNIX命令原始文件是:
command file > tmp && mv tmp file
所以在這種情況下,它是:
awk 'script' file > tmp && mv tmp file
GNU awk有一個-i inplace
論點-i
就像SEDS創建TMP如果您喜歡邊緣簡潔,請在後臺備份文件:
awk -i inplace 'script' file
Great Morton。您建議的awk命令(嘗試第一個)打印輸出,但是我想更新plist文件(此處爲file1)。如果您可以相應地更新命令,那將會很好。 –
我在最後添加了關於如何更新文件的說明。 –
感謝莫頓,它的工作..再次感謝您的及時幫助。 –