我想匹配一系列数字和字符以将其替换为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
删除所有非数字、非换行符、非下划线和非破折号。然后我再次使用它将多个连续的换行符压缩为单个换行符。