GNU/Linux >> Linux の 問題 >  >> Linux

sedを使用してテキストを同じ長さに置き換えます

私の疑いは、標準の 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 つある


Linux
  1. Linuxでsedを使用してテキストファイルを検索および置換する

  2. Sedコマンドで一度に複数のパターンを使用する

  3. SedまたはExを使用してブロック(複数行コード)を新しいテキストブロック(コード)に置き換える方法は?

  1. 特殊文字でSedを使用していますか?

  2. 複数のファイルテキストをSedに置き換えますか?

  3. sed のようなテキストを python に置き換えるにはどうすればよいですか?

  1. sedを使用してコマンドラインでテキストを操作する

  2. LinuxでSed、ex、perlコマンドを使用してテキストを検索および置換する

  3. sed を使用して区切り文字で文字列を分割する