您好,我目前正在处理 csv 文件。
我想找到一个 bash 命令来帮助我找到特殊字符
?, !, #, *, %
还有字符空间,例如
' '
任何建议都会有帮助,我正在考虑使用 grep 函数,但不太确定这将如何应用于上述规范。
答案1
试试这个,将您想要查找的字符括在括号表达式[...]
。
grep '[?!#*% ]' infile
有一些例外,例如:
- if
^
字符:它可以放在任何位置,[]
但不能放在第一个字符中,因为^
字符首先会否定其括号表达式中的字符。 - if
]
字符:应该是第一个字符,因为该字符也用于结束括号表达式。 - if
-
字符:它应该是第一个或最后一个字符,因为该字符也可以用于定义字符范围。
取决于您想要对找到的字符执行的需要:
仅打印那些字符(如果存在)
grep -o '[?!#*% ]' infile
删除这些字符:
tr -d '[?!#*% ]' < infile ##or sed 's/[?!#*% ]//g' infile ##or awk '{ gsub(/[?!#*% ]/, "") }1' infile
将它们替换为一个空格:
tr '[?!#*% ]' ' ' < infile ##or sed 's/[?!#*% ]/ /g' infile ##or awk '{ gsub(/[?!#*% ]/, " ") }1' infile
替换为其他字符串:
sed 's/[?!#*% ]/someString/g' infile ##or awk '{ gsub(/[?!#*% ]/, "someString") }1' infile
打印至少其中一个出现在一行中的整行:
grep --color=none '[?!#*% ]' infile ##or sed '/[?!#*% ]/!d' infile ##or awk '/[?!#*% ]/' infile
ETC。
答案2
要查找至少与您提到的字符之一匹配的任何行:
grep '[ !?#*%]' file.csv # looks for space, !, ?, #, *, % into file.csv and shows matching lines
注意:某些字符需要位于特定位置(例如:“[ac]”查找“a、b 或 c”,而不是“a、- 或 c”)
您还应该指定 grep 将工作的语言环境。通常:C 语言环境。这有助于防止特定区域设置(对于 utf-8 的前变体)弄乱指定的范围(如果有)。
要在 csv 文件中查找“与除:字母或数字或逗号之外的任何字符匹配的任何行”(假设它使用逗号作为分隔符,否则只需更改您实际使用的分隔符):
LC_ALL=C grep '[^a-zA-Z0-9,]' file.csv
# and if you also accept doubleqhotes in that csv:
LC_ALL=C grep '[^a-zA-Z0-9,"]' file.csv
# and if instead of comma you use TAB as a separator
LC_ALL=C grep "[^a-zA-Z0-9$$(printf '\t')]\"" file.csv
-or-
LC_ALL=C grep "[^a-zA-Z0-9$$(printf '\t"')]" file.csv