4

行頭以外のテキストを置き換えるコマンドを書き込もうとしています:

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 のファイルを解析するスクリプトを書いており、しばらくの間、このスクリプトについて頭を悩ませてきました。

4

5 に答える 5

3

これは、複数の文字を一緒に処理する必要があります。

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

一部のsed\nは交換部品で受け付けますのでその場合は

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

あまりにも動作するはずです

于 2013-09-11T22:19:28.303 に答える
1

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 を保護したい場合は、それらをすべて改行に変更してから、これは、たとえば、すべての行の最初の「単語」などを保護できるようにするためのものです。)

于 2013-09-11T23:11:56.850 に答える
0

システムで Perl を使用できますか? その場合、これは sed コマンドの直接の置き換えとして機能します。

perl -pe '($c,$_)=/(.)(.*)/s;s/b/x/g;$_=$c.$_'
于 2013-09-11T23:38:03.373 に答える