2014-05-22 78 views
0

我們希望修改plist文件,以便在匹配模式後,它應該使用sed shell命令插入幾行。sed:在換行後插入特定模式的行

plist文件格式如下:

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

我們要找到第一個快譯通標籤後插入幾行。

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

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

所以,我試圖找到plist和字典標記,然後插入行。

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

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

這也不起作用了這一點,是不是能找到文件中的模式。

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

回答

1

戰略經濟對話的簡單替代上一個極好的工具一行,其他的只是使用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 
+0

Great Morton。您建議的awk命令(嘗試第一個)打印輸出,但是我想更新plist文件(此處爲file1)。如果您可以相應地更新命令,那將會很好。 –

+0

我在最後添加了關於如何更新文件的說明。 –

+1

感謝莫頓,它的工作..再次感謝您的及時幫助。 –

1

這可能會爲你工作(GNU SED):

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

它給出了一個錯誤'sed:1:「1,/ /{/ /{rt ...」:意外的EOF(正在執行)')我們在OS X上使用sed –

0

嘗試了「N'-二命令啓用新行匹配:

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

只能在樣本上工作,if任何一行在之前都失敗 – NeronLeVelu

+0

它給出了一個錯誤:'sed:1:「N;/ \ n \ s \ + /...」:命令a期望\後跟文本' –