首页 > 解决方案 > 从文件中删除未知的特殊字符

问题描述

我想从管道分隔文件中删除除 |、_、- 和 .s 之外的所有特殊字符。

例如,我的数据文件看起来像..

ABCD|123|Name
EFGH|456|New-Name
IJKL|789|New_Name
MNOP|123|New*name
QRST|124|New/name
UVWX|353|Name_*%NAME
EFGH|456|New=Name
Eaba|456|New****Name
fdsf|456|New-----Name
iouk|456|New(#$%^)_Name

我已经尝试了以下但无法实现,或者我只是完成了一半。

tr -cd '[:print:]' < temp.txt > newfile -- I still get all the special chars.
tr -cd '[:alnum:]' <temp.txt -- I get only aphanum chars but I want to have a few special chars.
cat temp.txt | sed 's/[a-zA-Z0-9|_-.]//g' | sed '/^$/d' -- I get all the special chars but repetition is there

下面给了我输出为

$ cat temp.txt | sed 's/[a-zA-Z0-9|_-.]//g' | sed '/^$/d' | tr -cd '[:print:]' | sort -u
""""){***+#=**~>>\+*****<(")

如果我至少得到所有唯一的特殊字符,我将能够将所有内容放入 sed 并替换为 null。

我的预期输出是:

ABCD|123|Name
EFGH|456|New-Name
IJKL|789|New_Name
MNOP|123|New_name
QRST|124|New_name
UVWX|353|Name_NAME
EFGH|456|New_Name
Eaba|456|New_Name
fdsf|456|New_Name
iouk|456|New_Name

如果这有助于减少代码,我需要查看特定的列。如前所述,代码必须包含 |、_、- 字符并删除其他所有内容。让我知道你们是否正在寻找更多信息。

标签: bashunixawksed

解决方案


听起来“特殊字符”是指非字母数字。如果是这样,那么只需使用[:alnum:]字符类的否定来匹配这些字符,例如,在每个 UNIX 框上的任何 shell 中使用任何 awk,并且只更改第 3 列,因为您说“我需要查看特定列”:

$ awk 'BEGIN{FS=OFS="|"} {gsub(/[^[:alnum:]-]+|--+/,"_",$3)} 1' file
ABCD|123|Name
EFGH|456|New-Name
IJKL|789|New_Name
MNOP|123|New_name
QRST|124|New_name
UVWX|353|Name_NAME
EFGH|456|New_Name
Eaba|456|New_Name
fdsf|456|New_Name
iouk|456|New_Name

如果[^[:alnum:]-]是错误的,那么只需使用您想要的任何字符类和/或列出特定的 chars [^*\/%-]。请注意,您不需要在正则表达式中显式处理,因为-separated 字段|中不能有 a ||


推荐阅读