【问题标题】:Bash: How to use sed to remove all characters except letters and numbers?Bash:如何使用 sed 删除除字母和数字以外的所有字符?
【发布时间】:2015-02-19 21:43:48
【问题描述】:

首先,我还在学习正则表达式,我在谷歌上搜索过,但还是不行。

如何删除带有sed 的变量中除字母和数字之外的所有字符?例如我有这个文本文件:

MytextOnly !@#!text@@32423#@$text#%$#text%#t23432ext$32342%^-_+-=-_++_;:"'][}}{|\/

如何只显示字母和数字?

【问题讨论】:

  • 为什么指定答案必须“使用 sed”?为什么不寻求使用 bash 或 POSIX 标准化工具的答案,让人们为您提供最适合这项工作的工具?
  • 因为我不知道,所以请记住我还在学习中
  • 这就是我的观点——因为你还在学习,所以最好以足够笼统的方式提出问题,让他们对可能超出你最初期望的范围的答案敞开心扉。例如,如果你有SomeShellVar='abc123def456',你可以echo "${SomeShellVar//[^[:alpha:]]/}"(或者LettersOnly=${SomeShellVar//[^[:alpha:]]/},如果你不想echo输出)来删除任何不是字母的东西,完全在bash内部。与[^[:alnum:]] 相同,只留下字母和数字——在使用 shell 变量时比任何外部工具都要快。
  • ...当然,这种方法专注于变量,而不是文件;对于处理文件,您现在的答案很好(尽管如果您想以适用于所有 POSIX 平台的方式就地进行文件编辑,ex 是另一个很好的了解工具)。
  • 谢谢查尔斯,我会记住的

标签: regex bash shell sed grep


【解决方案1】:

你可以使用:

sed 's/[^[:alnum:]]\+//g' file
MytextOnlytext32423texttextt23432ext32342

[^[:alnum:]] 属性将查找所有非字母数字字符。


编辑:基于以下 cmets:

sed 's~[^[:alnum:]/]\+~~g' file
MytextOnlytext32423texttextt23432ext32342/

【讨论】:

  • 谢谢你的作品,你能解释一下\+的作用吗?如果我也想添加正斜杠,那么它会显示字母、数字和正斜杠怎么办?
  • 因为/g global \+ 甚至没有必要,我认为。
  • 检查我更新的答案是否允许正斜杠。 @Tiago:量词 + 用于提高效率,从而减少发生的替换次数。
【解决方案2】:

使用grep

grep -o '[[:alnum:]]' file

同意,没有完美的输出,但一切都在那里

使用tr

$ tr -d -c '[:alnum:]' < file
MytextOnlytext32423texttextt23432ext32342

如果您还想保留正斜杠:

$ tr -d -c '[:alnum:]/' < file
MytextOnlytext32423texttextt23432ext32342/

有关 python 解决方案,请参阅https://stackoverflow.com/a/5843560/297323

【讨论】:

  • 如果我也想添加正斜杠怎么办,所以它显示字母、数字和正斜杠
  • 然后只需将\/ 添加到字符类,-c 标志会否定指定的所有内容,即删除与字符类不匹配的所有内容
  • 对于那个python链接,我如何保留空格和正斜杠?所以它显示字母、数字、空格和正斜杠?
猜你喜欢
  • 2022-09-27
  • 2017-09-01
  • 2013-01-16
  • 2013-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-24
相关资源
最近更新 更多