bash - 从文件中删除未知的特殊字符
问题描述
我想从管道分隔文件中删除除 |、_、- 和 .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
如果这有助于减少代码,我需要查看特定的列。如前所述,代码必须包含 |、_、- 字符并删除其他所有内容。让我知道你们是否正在寻找更多信息。
解决方案
听起来“特殊字符”是指非字母数字。如果是这样,那么只需使用[: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 |
。|
推荐阅读
- r - R latticeExtra c.trellis 中缺少右刻度线
- javascript - 如何将拖动的项目重叠在拖放的项目上?
- google-apps-script - doGet() 函数建议
- python - 使用 Open CV 和 Python 连接到 Cognex 相机
- javascript - 如何在javascript中迭代多个标头
- sql - 分组依据和使用同一列
- c++ - 如何访问 C++ 中的下一个节点?
- r - 从两个不同的数据帧计算相似发音词的数量和名称
- python - 如何更改代码以查找 word2vec 执行中单词之间的欧几里德距离(不是余弦)?
- java - 如何在 SecurityManager 中检查调用者类的来源?