替换以下特殊字符,。@

时间:2018-06-07 21:38:59

标签: regex awk gsub

我正在寻找一个从文件中删除特殊字符的选项,除了以下3项,。@

以下awk命令会关闭,但会删除所有标点符号。

awk '{gsub(/[[:punct:]]/,"",except(".","@",","))}1' test.csv > test2.csv

任何想法......

2 个答案:

答案 0 :(得分:2)

POSIX中没有相反的字符类,也没有外观限制更通用的模式,但有一些例外。唯一的方法是拼出POSIX字符类。

根据Character Classes and Bracket Expressions

  

“[:PUNCT:]”
  标点字符;在“C”语言环境和ASCII字符编码中,这是! " # $ % & ' {{ 1}} ( ) * + , - . / : {{ 1}} ; < = > ? @ [ \ ] {{ 1}} ^ _ \ {

您可以使用

|

请参阅regex demo

图例

enter image description here

答案 1 :(得分:0)

这三种方法都适用于任何语言环境,只需更改类名即可用于任何字符类,并适用于其他括号表达式或字符串等。

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(),其他awks你需要匹配()+ substr()。