使用 sed 匹配一系列数字和其他字符

使用 sed 匹配一系列数字和其他字符

我想匹配一系列数字和字符以将其替换为sed;我倾向于编写类似 Perl 的正则表达式:

[\d-_]+

例如,匹配数字、破折号和下划线。它的作用就像一个魅力grep

$ 更多 sed_example.txt
一些2021-04-21_08-45_file
其他一些事情 2021-04-21_08-15_test
等等
$ grep -P "[\d-_]+" sed_example.txt
某物2021-04-21_08-45_文件
其他一些事情2021-04-21_08-15_测试

所以现在我想对 sed 做同样的事情,但即使使用扩展表达式 ( -r) 我也无法使用\d,也无法将范围(如[0-9]或 )[[:digits:]]与其他字符组合,或者至少我没有找到方法。一个解决方案是明确列出所有数字,但我有点太懒了。

任何帮助,将不胜感激!

答案1

您的范围[\d-_]没有意义(没有从 开始\d并运行到 的范围_)。你的意思[\d_-]

POSIX 等效项[\d_-][[:digit:]_-]or [0-9_-]。请注意,要在括号表达式中包含文字破折号,它必须出现在第一个或最后一个。

$ grep -o '[[:digit:]_-]\{1,\}' file
2021-04-21_08-45_
2021-04-21_08-15_
$ sed -n 's/.* \([[:digit:]_-]\{1,\}\).*/\1/p' file
2021-04-21_08-45_
2021-04-21_08-15_

请注意,我必须在这里匹配第一个数字前面的空格,否则我只捕获_最后的。

您还可以使用更具体的正则表达式,它实际上尝试匹配您正在查找的表单上的某些内容,而不仅仅是任何数字、破折号或下划线:

$ sed -n 's/.*\([0-9]\{4\}-[0-9][0-9]-[0-9][0-9]_[0-9][0-9]-[0-9][0-9]_\).*/\1/p' file
2021-04-21_08-45_
2021-04-21_08-15_

$ tr -d -c '\n[:digit:]_-' <file | tr -s '\n'
2021-04-21_08-45_
2021-04-21_08-15_

在这里,我用来tr删除所有非数字、非换行符、非下划线和非破折号。然后我再次使用它将多个连续的换行符压缩为单个换行符。

相关内容