为什么sed不接受regex替换请求

wpx232ag  于 2022-11-18  发布在  其他
关注(0)|答案(2)|浏览(142)

我有一个如下的grep结果

Nov-06-22 00:01:16 id-03674-09704 
Nov-06-22 00:01:16 id-03642-04246

我需要从结果中删除id-.....-.....部分。
我使用的是:

grep file.txt | sed 's/ id-(\d){5}-(\d){5}/ /g'

但它返回

Nov-06-22 00:01:16 id-03674-09704 
Nov-06-22 00:01:16 id-03642-04246

我检查了regex id-(\d){5}-(\d){5},应该没问题。
为什么sed不替换grep结果?

xesrikrc

xesrikrc1#

由于您使用的是POSIX BRE regex flavor和sed,因此\d不会被识别为数字匹配构造,并且{5}会被视为文字{5}字符串,而不是区间量词。
您需要将\d替换为[0-9],并使用-E选项启用POSIX ERE语法(或转义间隔限定符大括号):

sed -E 's/ id-[0-9]{5}-[0-9]{5}//' file
sed 's/ id-[0-9]\{5\}-[0-9]\{5\}//' file

请参阅online demo

#!/bin/bash
s='Nov-06-22 00:01:16 id-03674-09704 
Nov-06-22 00:01:16 id-03642-04246'
sed -E 's/ id-[0-9]{5}-[0-9]{5}//' <<< "$s"

输出量:

Nov-06-22 00:01:16 
Nov-06-22 00:01:16

此外,仅考虑removing last columnawk,甚至与cut

awk 'NF{NF-=1};1' file.txt
cut -d' ' -f1,2 < file.txt
wgx48brx

wgx48brx2#

你可以简单地使用cut,通过指定一个分隔符,我假设在你的例子中是空格。你首先需要读取你的文件,然后使用cut命令。假设你已经有了一个包含所选行的文件,那么你可以如下使用cut

cat file.txt | cut -d' ' -f1,2

输出:

Nov-06-22 00:01:16
Nov-06-22 00:01:16

相关问题