Sed 不将正则表达式中的匹配输出到文件

Sed 不将正则表达式中的匹配输出到文件

我有一个文件(data.txt),其中包含如下字符串:

[?1h=
=> ["AD070517",
 "AD070518",
: ESCESCOOBB "AD070809",
 "NE0000013",
 "NE0000014",
: ESCESC[[66~~ "LG100085-097",
 "LG100085-098",
]

我尝试使用以下命令仅从数组中提取条目(减去双引号):

sed -r 's/([-A-Z0-9]+)"/\1/g' data.txt > clean.txt

根据这个正则表达式片段,对照组和比赛按预期进行,据我了解这个帖子我应该能够仅输出 sed 中的匹配项并将输出流定向到新文件,但生成的 clean.txt 文件是 data.txt 的精确副本,没有任何内容被过滤掉。

答案1

您的sed命令不应仅输出匹配项。

s/pattern/replacement/g只是用替换件替换了图案,其他一切都保持不变。

实际上,输出不应该是精确的副本,而是"模式被删除后的副本。


您可能想使用grep

grep -Eo '[-A-Z0-9]+"' data.txt | sed 's/"$//' > clean.txt

或者

grep -Po '[-A-Z0-9]+(?=")' data.txt > clean.txt

答案2

使用 -n 仅显示匹配的行。

sed -n -r 's/([-A-Z0-9]+)"/\1/g' data.txt > clean.txt

对于第二个问题,将不需要的东西替换为空:

sed -n -r 's/^.*"([-A-Z0-9]+)".*/\1/g' data.txt > clean.txt

答案3

您可以告诉 sed 仅在替换成功时才打印。使用该t命令:它会转到指定的标签(如果有)。b跳过其余代码,p打印替换的行。

sed -n -r 's/.*"([-A-Z0-9]+)".*/\1/g;t a;b;:a p' 

我必须在最后两行添加两个缺失的双引号。

使用 Perl 可能更具可读性:

perl -lne 'print $1 if /([-A-Z0-9]+)"/'

相关内容