假設我們有一個包含以下內容的檔案:
<tag1>
junk1
junk2
</tag1>
data1
data2
data3
<tag1>junk3</tag1>
data4
data5
所以,我們想洗掉兩個字串 what are<tag1>和</tag1>here之間的所有資料。我可以使用以下sed命令完成這項作業:
cat input | sed '/<tag1>/,/<\/tag1>/d'
但是出現了一個問題,命令運行不正常,tag1輸出中去掉了單行標簽后的資料。上述命令的輸出:
data1
data2
data3
所以,主要問題是,即使是單行或多行資料,我們如何洗掉兩個字串/標簽/模式之間的資料?
謝謝
uj5u.com熱心網友回復:
- 由于
sed無法決議 xml 檔案,因此在許多情況下sed效果不佳(例如注釋標簽中的標簽)。 - 由于
sed正則運算式不支持非貪婪匹配,我們需要考慮解決方法。
基于以上,請您嘗試:
sed $'s/<tag1>/&\\\n/g' input | sed '/<tag1>/,/<\/tag1>/d'
輸出:
data1
data2
data3
data4
data5
第一個sed只是在<tag1>.
盡管它適用于提供的示例,但請注意在許多情況下它不能很好地作業(例如</tag1>丟失)。
uj5u.com熱心網友回復:
洗掉范圍之前的單行匹配可能會有所幫助,因為如果在第一次匹配之后找不到另一個匹配,則范圍將匹配到檔案末尾,在您的情況下,單行匹配。
$ sed '/>[a-z0-9]*</d;/</,/>/d' input_file
data1
data2
data3
data4
data5
/>[a-z0-9]*</d- 在這里,首先匹配單行。如果需要,它可以精確定位,但>在這種情況下支架就足夠了。
/</,/>/d- 現在您的原始代碼已實作,因為現在只有一個范圍匹配,它洗掉該范圍并回傳其他所有內容。再一次,它可以更精確,tag1但在這種情況下再次就足夠了。
uj5u.com熱心網友回復:
注:cat input | sed SCRIPT沒用,干脆sed SCRIPT input。讓我們假設:
- 你使用 GNU sed,
- 你可能有其他標簽(例如,
<tag2>), - 您可能在同一行上有多個組 (
a<tag1>b</tag1>c<tag1>d</tag1>e), - 您沒有嵌套組 (
<tag1>a<tag1>b</tag1>c</tag1>), - 你所有的
<tag1>和</tag1>都得到了適當的平衡。
GNU sed 有一個簡潔的-z選項,它將 NUL 字符視為行終止符,而不是換行符。因此,由于您的輸入檔案不包含任何 NUL 字符,因此可以將其內容視為單個字串(其中包含換行符)。
因此,我們可以開始洗掉<tag1>...</tag1>組,而無需考慮它們是否在同一“行”上。但是由于 sed 是貪婪的,我們不能簡單地s#<tag1>.*</tag1>##g洗掉第一個<tag1>和最后一個之間的所有內容</tag1>:如果您有多個組,它也會洗掉組之間的文本。
然而,我們可以回圈遍歷兩個替代命令:一個洗掉空組<tag1></tag1>,然后一個洗掉 之后的任何單個字符<tag1>,只要洗掉單個字符就重復:
$ cat input
<tag1>
junk1
junk2
</tag1>
data1
data2<tag1>junk3</tag1>data3<tag1>junk4</tag1>data4
data5
<tag1>junk5</tag1>
data6
<tag1>junk6</tag1>
$ sed -Ez ':a;s#<tag1></tag1>##g;s#(<tag1>).#\1#g;ta' input
data1
data2data3data4
data5
data6
解釋::a是一個標簽,用于回圈。s#<tag1></tag1>##g洗掉所有空組。s#(<tag1>).#\1#g洗掉<tag1>.之后的任何單個字符。如果先前的替換成功,則ta分支以進行標記a。換句話說,我們回圈直到沒有替換;在每次迭代中,我們洗掉所有空組并洗掉所有非空<tag1>,</tag1>對之間的一個字符。當我們停下來時,所有的組都被洗掉了。
如果它留下的空行也將被洗掉,我們只需添加一個洗掉所有空“行”的最終命令。它通過替換兩個換行符之間(或模式空間的開頭和換行符之間)的任何空格字串(可以為空)、單個換行符(如果它在模式的開頭則不替換)來實作這一點空間):
$ sed -Ez ':a;s#<tag1></tag1>##g;s#(<tag1>).#\1#g;ta;s#(\`|\n)\s*\n#\1#g' input
data1
data2data3data4
data5
data6
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/378756.html
上一篇:我在將bash命令轉換為shell腳本中的shell腳本語法錯誤時遇到錯誤
下一篇:管道回聲和貓不起作用
