将一系列字符替换为相同数量的字符

将一系列字符替换为相同数量的字符

我想用空格字符串替换包含不同长度的波浪号字符的字符串。例如,如果一个字符串包含 5 个波浪号字符:~~~~~,那么我想用 5 个空格替换它。

我当前的sed命令:

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

我可以检查一个或多个波浪号字符,但不知道如何检索插入空格的长度

答案1

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

~将用空格替换所有s。如果您只想替换每行~第一个 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\}/'

相关内容