![将一系列字符替换为相同数量的字符](https://linux22.com/image/105960/%E5%B0%86%E4%B8%80%E7%B3%BB%E5%88%97%E5%AD%97%E7%AC%A6%E6%9B%BF%E6%8D%A2%E4%B8%BA%E7%9B%B8%E5%90%8C%E6%95%B0%E9%87%8F%E7%9A%84%E5%AD%97%E7%AC%A6.png)
我想用空格字符串替换包含不同长度的波浪号字符的字符串。例如,如果一个字符串包含 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\}/'