簡體   English   中英

sed:使用換行符在特定模式后插入行

[英]sed : Insert lines after specific pattern with newline

我們想要修改一個plist文件,這樣在匹配一個模式后,它應該使用sed shell命令插入幾行。

plist文件格式如下:

<plist> 
   <dict>
     .
     .
     <key>abc</key>
     <dict>
        .
        .
     </dict>
     .
     .
    </dict>
</plist>

我們想在找到第一個dict標簽后插入幾行。

如果我使用follow命令,它會在文件中的所有dict標簽之后插入。

sed -i '' "/<dict>/ r template" info.plist

所以,我試圖在那之后找到plist和dict標簽並插入行。

sed -i '' "/<plist version=\"1.0\">\n<dict>/r template" info.plist

要么

sed -i '' "/\(^<plist version=*.\)/ r template" info.plist

這也不起作用,它無法在文件中找到模式。

請建議我如何放置一個包含由換行符分隔的兩個字符串的模式。

這可能適合你(GNU sed):

sed -i -e '1,/<dict>/{/<dict>/{r template' -e '}}' file

sed是在單行上進行簡單替換的優秀工具,對於任何其他只使用awk的東西。 如果你在sed中使用除s,g和p(和-n)之外的任何東西,那么你使用的是錯誤的工具和語言結構,這些結構在1970年代中期發明時就已經過時了。

有很多方法可以做到這一點。 這是一個:

$ 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 inplace參數,就像seds -i ,如果你喜歡邊緣簡潔,可以在后台創建tmp文件:

awk -i inplace 'script' file

嘗試使用'N'命令啟用換行符匹配:

sed 'N;/<plist>\n\s\+<dict>/a added line' info.plist

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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