Regex 替换除以下字符外的特殊字符@
我正在寻找从文件中删除特殊字符的选项,以下3项除外@ 下面的awk命令很接近,但它删除了所有标点符号Regex 替换除以下字符外的特殊字符@,regex,awk,gsub,Regex,Awk,Gsub,我正在寻找从文件中删除特殊字符的选项,以下3项除外@ 下面的awk命令很接近,但它删除了所有标点符号 awk '{gsub(/[[:punct:]]/,"",except(".","@",","))}1' test.csv > test2.csv 任何想法 POSIX中没有相反的字符类,也没有用于限制更通用模式的lookarounds,只有一些例外。唯一的方法是拼写POSIX字符类 根据: “[:点:” 标点符号;在“C”语言环境和ASCII字符编码中,这是“&()*,
awk '{gsub(/[[:punct:]]/,"",except(".","@",","))}1' test.csv > test2.csv
任何想法 POSIX中没有相反的字符类,也没有用于限制更通用模式的lookarounds,只有一些例外。唯一的方法是拼写POSIX字符类 根据: “[:点:”
标点符号;在“C”语言环境和ASCII字符编码中,这是
“
&
(
)
*
,
^
{
<124;
}
你可以用
/[!-+\/:-?[-`{-~-]/
看
图例:
所有这三种方法都适用于任何语言环境,只需更改类名即可适用于任何字符类,也适用于其他括号表达式或字符串等:
1) 只需查找任何点刺,但仅当它不是您不想更改的字符之一时才进行更改:
$ echo 'a.b?c#d@e,f' |
awk '{
new = ""
while ( match($0,/[[:punct:]]/) ) {
chr = substr($0,RSTART,1)
new = new substr($0,1,RSTART-1) (chr ~ /[,.@]/ ? chr : "")
$0 = substr($0,RSTART+RLENGTH)
}
print new $0
}'
a.bcd@e,f
2) 先将不希望更改的字符转换为其他字符串,然后再将其转换回:
$ echo 'a.b?c#d@e,f' |
awk '{
gsub(/a/,"aA"); gsub(/,/,"aB"); gsub(/\./,"aC"); gsub(/@/,"aD")
gsub(/[[:punct:]]/,"")
gsub(/aD/,"@"); gsub(/aC/,"."); gsub(/aB/,","); gsub(/aA/,"a")
print
}'
a.bcd@e,f
将a
更改为aA
并返回可确保您在转换@
等时创建的字符串是当时输入中其他地方不存在的字符串,这就是为什么您可以在以后安全地将其转换回
3) 使用RS值为点添加后缀,然后从不希望更改的字符中删除RS后缀,然后更改剩余的RS后缀点:
$ echo 'a.b?c#d@e,f' |
awk '{
gsub(/[[:punct:]]/,"&"RS)
$0 = gensub("([,.@])"RS,"\\1","g")
gsub("[[:punct:]]"RS,"")
print
}'
a.bcd@e,f
其中一个使用GNU awk表示gensub(),而其他awk则需要match()+substr()。这是一种方法,但它肯定不是唯一的方法,其他处理此问题的常用方法与语言环境无关。