[英]Sed replace pattern with file contents
我想用sed
(我認為?)用文件內容替換模式。
Hello <<CODE>>
Goodbye.
Anonymous person,
I am very nice.
Hello Anonymous person,
I am very nice.
Goodbye.
現在,我正在使用此命令:
sed "/<<CODE>>/{r file2
:a;n;ba}" file1 | \
sed "s/<<CODE>>//g" > \
file3
但這輸出:
Hello
Anonymous person,
I am very nice.
Goodbye.
(注意Hello
之后的換行符)
file2
可能包含各種各樣的東西:括號,換行符,引號,......) 使用awk更簡單:
awk 'FNR==NR{s=(!s)?$0:s RS $0;next} /<<CODE>>/{sub(/<<CODE>>/, s)} 1' file2 file1
Hello Anonymous person,
I am very nice.
Goodbye.
說明:
FNR==NR
- 對輸入中的第一個文件即file2
執行此塊 s=(!s)?$0:s RS $0
- 在字符串s
連接整個文件內容 next
- 在第一個文件上讀取下一行直到EOF
/<<CODE>>/
- 如果找到帶有<<CODE>>
的行,則執行該塊 sub(/<<CODE>>/, s)
- 用字符串s
替換<<CODE>>
( file2
數據) 1
- 打印輸出 編輯:非正則表達方式:
awk 'FNR==NR{s=(!s)?$0:s RS $0; next}
i=index($0, "<<CODE>>"){$0=substr($0, 1, i-1) s substr($0, i+8)} 1' file2 file1
該awk
雖然它可能是難以閱讀,可能是正確的道路要走。
僅僅為了比較,這是一個紅寶石版本
ruby -ne 'BEGIN{@body=File.open("file2").read}; puts gsub(/<<CODE>>/,@body);' < file1
你可以簡單地用:
awk '{gsub("<<CODE>>", filetwo)}1' filetwo="$(<file2)" file1
我正在考慮一個解決方案,我們使用Bash來評估分隔sed
腳本的單引號之外的cat
進程,但不幸的是,只要file2
包含換行符,以下內容就不起作用:
sed 's/<<CODE>>/'"$(cat file2)"'/' file1
它接受file2
空格,但不接受新行,正如您在下面的代碼中看到的那樣,無論file2
的內容如何,它都能正常工作:
sed 's/<<CODE>>/'"$(cat file2 | tr -d '\n')"'/' file1
但是,顯然,這會在包含之前修改文件的內容,這簡直太糟糕了。 :-(
所以,如果你要玩,你可以先tr
換行符到一些奇怪的字符不可預料的,並可將這些背后sed
在其腳本的工作:
sed 's/<<CODE>>/'"$(cat file2 | tr '\n' '\3')"'/' file1 | tr '\3' '\n'
Perl
也不錯:
cat file1 | perl -e "open FH, qq(file2); \$f2=join '', <FH>; chomp \$f2; map {s/<<CODE>>/\$f2/g; print \$_} <STDIN>" > file3
(也許我不是最好的perl編碼器)
這是直截了當的。 讀取整個文件2,替換它,然后打印。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.