簡體   English   中英

sed中的匹配范圍

[英]matching ranges in sed

在我的編程中,我需要使用sed在某個文件中將一些字符替換為另一個字符。 但在某些單詞之間,只有當這個字符串包含一些額外的單詞時。 所以我寫道:

sed -re '/from:/,/end/ { /extraword/s/[_old_characters_]/new_character/g; }'

但是這段代碼完全忽略了這個/from:/,/end/ strings。 它將所有[_old_characters_]替換為new_characterfrom:到此行的末尾。 我做錯了什么?

我需要的是:

sed -re '/A/,/B/ { /word/s/[C]/X/g; }'

文件:

word CCC A CCC B CCC
wor A CCC B

變為:

word CCC A XXX B CCC
wor A CCC B

這可能適合你(GNU sed):

sed -r '/word/{:a;/(A)([^ABC]*C+[^ABC]*)(B)/{s//\1\n\2\n\3/;h;y/C/X/;G;s/.*\n(.*)\n.*\n(.*)\n.*\n/\2\1/;ba}}' file

這個過濾行包含單詞wordA后跟C后跟B 然后這些線具有放置在A之后和B之前的標記( \\n ),並且該線的副本被放置在保持空間(HS)中。 將所有C替換為X ,然后將HS中的副本附加到修改后的行中,並從兩者重建所需的行。 然后再次測試新生產線,如有必要,重復該過程。

如果AB是單詞,那么使用相同的技術,但在A之后和之前用B替換\\n ,然后測試/ \\n .*C.* \\n如果條件/\\n.*C.*\\n/記住刪除所有\\n

如果使用sed證明太難看,這是一個Perl解決方案:

$ perl -pe 'if (m/word/) {s/(A[^C]*) (.*) ([^C]*B)/$1 . " " . "X" x length($2) . " " . $3/gei;}'
word CCC A CCC B CCC
word CCC A XXX B CCC
wor A CCC B
wor A CCC B

就像是

sed '/^word/s/A CCC B/A XXX B/g'

例如

>>> echo word CCC A CCC B CCC | sed '/^word/s/A CCC B/A XXX B/g'
word CCC A XXX B CCC

暫無
暫無

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

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