簡體   English   中英

sed - 匹配不是行的開頭

[英]sed - match NOT beginning of line

我正在嘗試編寫一個命令來替換行開頭的文本:

echo -e 'a b b\nb b c' | sed 's%^b%x%g'

輸出:

a b b
x b c

期望的輸出:

a x x
b x c

我正在編寫一個解析400 MB文件的腳本,而且我一直在敲打這個文件。

這應該適用於多個字符:

sed 's/^b/\
/; s/b/x/g; s/^\n/b/' 

有些sed在替換部分接受\\n ,所以在那種情況下

sed 's/^b/\n/; s/b/x/g; s/^\n/b/'

也應該工作

這應該這樣做:

echo -e 'a b b\nb b c' | sed 's%\(.\)b%\1x%g'

Scrutinizer的想法中借鑒,這是一種保護部分線路的更通用的方法。 訣竅是我們采用(單行)模式空間並在“要保護的部分”之后插入換行符。 然后,我們僅對“換行后的內容”進行更改。 最后,我們刪除了保護換行符。

此版本更改所有b s,除了任何(一個或多個)“行首” b s,因此,例如,“bbc”變為“bxc”但“bbc bbc”變為“bbc bxc”而不是“bxc bxc” ”。

sed -e 's/^b*/&\
/
s/\n\(.*\)b/\1x/g
s/\n//'

(可以使用相同的方法來保護文本到行尾,盡管它更加困難。)

(注意:這不是那么有效,因為sed現在必須更改每一行,一次添加保護器然后再次刪除它。如果你真的只想保護多個前導b你可以將它們全部轉換為換行符,並且然后把它們轉回來。這更多的意思是允許保護,例如,每一行上的第一個“單詞”。)

你的系統上有Perl嗎? 在這種情況下,這可以作為sed命令的直接替換:

perl -pe '($c,$_)=/(.)(.*)/s;s/b/x/g;$_=$c.$_'

這可能適合你(GNU sed):

sed '/^b/s/b/x/2g;/^b/!s/b/x/g' file

要么

sed -r ':a;s/^(..*)b/\1x/;ta' file

暫無
暫無

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

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