簡體   English   中英

Sed用文件內容替換模式

[英]Sed replace pattern with file contents

我想用sed (我認為?)用文件內容替換模式。

文件1(主文件)

Hello <<CODE>>
Goodbye.

文件2(內容)

Anonymous person,
I am very nice. 

文件3(目標)

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM