行頭以外のテキストを置き換えるコマンドを書き込もうとしています:
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/'
あまりにも動作するはずです
Scrutinizer のアイデアを借りて、行の一部を保護するより一般的な方法を次に示します。コツは、(1 行の) パターン スペースを取り、「保護する部分」の後に改行を挿入することです。そして、「改行以降」のみを変更します。最後に、保護改行を削除します。
このバージョンb
では、(1 つ以上の)「行頭」以外のすべての sが変更さb
れるため、たとえば、「bb c」は「bx c」になりますが、「bbc bbc」は「bxc bxc」ではなく「bbc bxc」になります。 "。
sed -e 's/^b*/&\
/
s/\n\(.*\)b/\1x/g
s/\n//'
(同じ方法を使用して、行末に向かってテキストを保護することができますが、これは非常に困難です。)
(注: sed はすべての行を変更する必要があるため、これは効率的ではありません。一度プロテクターを追加してから削除する必要があります。本当に複数の先頭b
の s を保護したい場合は、それらをすべて改行に変更してから、これは、たとえば、すべての行の最初の「単語」などを保護できるようにするためのものです。)
システムで Perl を使用できますか? その場合、これは sed コマンドの直接の置き換えとして機能します。
perl -pe '($c,$_)=/(.)(.*)/s;s/b/x/g;$_=$c.$_'