私の疑いは、標準の sed
ではできないということです 、しかし、Perl や、より強力な正規表現処理を備えた他のものでそれを行うことができます.
$ echo "She sells sea shells by the sea shore" |
> perl -pe 's/(sh[a-z]*)/"." x length($1)/gei'
... sells sea ...... by the sea .....
$
e
修飾子は、置換パターンが実行可能な Perl スクリプトであることを意味します。この場合、文字 .
を繰り返します 一致したパターンに含まれる文字の数だけ。 g
修飾子は行全体で繰り返されます。 i
修飾子は、大文字と小文字を区別しない一致用です。 -p
Perl のオプションは、-e
で指定されたスクリプトでの処理後に各行を出力します。 オプション — 代替コマンド。
この awk-oneliner は役に立ちますか?
awk '{for(i=1;i<=NF;i++)if($i~/^[Ss]h/)gsub(/./,".",$i)}1' file
データでテスト:
kent$ echo "She sells sea shells by the sea shore"|awk '{for(i=1;i<=NF;i++)if($i~/^[Ss]h/)gsub(/./,".",$i)}1'
... sells sea ...... by the sea .....
古い質問ですが、かなり短い 1 行の sed ソリューションを見つけました:
sed ':a;s/\([Ss]h\.*\)[^\. ]/\1./;ta;s/[Ss]h/../g'
ループ内で一度に 1 文字ずつ置換することで機能します。
:a;
ループを開始
s/\([Ss]h\.*\)[^\. ]
sh
を検索します その後に任意の数の .
が続きます s (これまでに完成した作業) の後に、ドットまたはスペース以外の文字 (置き換えようとしているもの) が続きます
/\1./;
これまでに完了した作業と別の .
で置き換えます .
ta;
置換を行った場合はループし、そうでない場合は...
s/[Ss]h/../g
sh
を置き換えます .
が 2 つある