特定の範囲の文字を同じ数の文字に置き換えます。

特定の範囲の文字を同じ数の文字に置き換えます。

異なる長さのチルダ文字を含む文字列を空白文字列に置き換えたいと思います。たとえば、文字列に5つのチルダ文字が含まれている場合は、5つのスペースに~~~~~置き換えたいと思います。

私の現在のsedコマンド:

sed -e '/\\begin{alltt}/,/\\end{alltt}/s/~\+/ /' test.tex

1つ以上のチルダ文字を確認できますが、挿入されたスペースの長さを取得する方法がわかりません。

ベストアンサー1

sed '/\\begin{alltt}/,/\\end{alltt}/s/~/ /g'

~すべてのsを空白に置き換えます。~各行の順序で最初のsだけを置き換えるには、次のようにします。~

sed '
  /\\begin{alltt}/,/\\end{alltt}/{
    /~/ {
      h; # save a copy
      s/\(~\{1,\}\).*/\1/; # remove everything after the first sequence of ~s
      s/~/ /g; # replace ~s with spaces
      G; # append the saved copy
      s/\n[^~]*~*//; # retain only what's past the first sequence of ~s
                     # from the copy
    }
  }'

注:\{1,\}GNU拡張と同等の標準\+

以下を使用する方が簡単ですperl

perl -pe 's{~+}{$& =~ s/~/ /gr}e if /\\begin\{alltt\}/ .. /\\end\{alttt\}/'

または:

perl -pe 's{~+}{" " x length$&}e if /\\begin\{alltt\}/ .. /\\end\{alttt\}/'

おすすめ記事