Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 替换除以下字符外的特殊字符@_Regex_Awk_Gsub - Fatal编程技术网

Regex 替换除以下字符外的特殊字符@

Regex 替换除以下字符外的特殊字符@,regex,awk,gsub,Regex,Awk,Gsub,我正在寻找从文件中删除特殊字符的选项,以下3项除外@ 下面的awk命令很接近,但它删除了所有标点符号 awk '{gsub(/[[:punct:]]/,"",except(".","@",","))}1' test.csv > test2.csv 任何想法 POSIX中没有相反的字符类,也没有用于限制更通用模式的lookarounds,只有一些例外。唯一的方法是拼写POSIX字符类 根据: “[:点:” 标点符号;在“C”语言环境和ASCII字符编码中,这是“&()*,

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

下面的awk命令很接近,但它删除了所有标点符号

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()。

这是一种方法,但它肯定不是唯一的方法,其他处理此问题的常用方法与语言环境无关。