我过去曾使用awk进行大型文件操作和substitutions.Recently,我用它来替换带有一组字符的前字母A:
$ awk '{gsub(/A/,"@@@")}1' in.txt >> out.txt其中in.txt包含各种长度的字母字符串。(AAA、BBB、CCC、AAA等)
稍后编辑:我正在使用一个WSL版本的Ubuntu。另外,我也考虑过sed,但是对于大型文本文件,它不太好用。
如何使用gsub将文件中的所有字符A替换为@@,B替换为###,C替换为%%等
我猜应该是很接近:
$ awk '{gsub(/A|B|C/,"&123")}1' in.txt > out.txt非常感谢!
稍后编辑:我正在Win10上使用WSL版本的Ubuntu。另外,我也考虑过使用sed,但是它对大型文件不太好用。
发布于 2020-04-17 17:28:08
据我所知,awk的gsub不能做更简单的文本替换。但是,您可以使用match函数的重复应用程序来实现基于哈希的查找,并替换子字符串--类似于:
awk '
BEGIN{c["A"]="@@@"; c["B"]="###"; c["C"]="%%%"}
{
while(match($0,/[A-C]/)) {
$0 = substr($0,1,RSTART-1) c[substr($0,RSTART,1)] substr($0,RSTART+1,length($0)-RSTART)
}
}
1
' in.txt相比之下,perl的s/patt/repl/g (大致相当于awk的gsub)有一个可选的e标志,允许在RHS上对代码进行e排序。所以你可以做这样的事
perl -pe 'BEGIN{%c = (A => "@@@", B => "###", C => "%%%")} $_ =~ s/[A-C]/$c{A6}/ge' in.txt这很可能更接近你的想法。
发布于 2022-02-01 15:18:53
gsub不适用于此任务。到目前为止,最简单的方法是使用tr命令:
cat in.txt | tr 'ABC' '@#%' > out.txt并检查输出:
cat out.txt
@@@, ###, %%%, @#@#@#https://askubuntu.com/questions/1227975
复制相似问题