如何删除文件中以特定字符串开头的所有单词?

如何删除文件中以特定字符串开头的所有单词?

如何删除文件中以特定字符串(在本例中为字符串“end”)开头的所有单词,以便:

<region> sample=PDL UP IN-A-1.flac lokey=21 hikey=21 lovel=0 hivel=21 end=423471 pitch_keycenter=21  
<region> sample=PDL UP IN-A-1_0001.flac lokey=21 hikey=21 lovel=22 hivel=42 end=370196 pitch_keycenter=21  
<region> sample=PDL UP IN-A-1_0002.flac lokey=21 hikey=21 lovel=43 hivel=63 end=362268 pitch_keycenter=21

变成:

<region> sample=PDL UP IN-A-1.flac lokey=21 hikey=21 lovel=0 hivel=21 pitch_keycenter=21  
<region> sample=PDL UP IN-A-1_0001.flac lokey=21 hikey=21 lovel=22 hivel=42 pitch_keycenter=21  
<region> sample=PDL UP IN-A-1_0002.flac lokey=21 hikey=21 lovel=43 hivel=63 pitch_keycenter=21 

使用命令行

我试过:

sed 's/\S*\(end\|END\)\S*//g' file.txt

但它没有起作用。

谢谢。

答案1

您已经非常接近了。您缺少的最大功能是启用扩展正则表达式。

其次,匹配项开头有“\S*”。这实际上没有任何作用,因为它允许在除空格之外的任何位置进行“一或零”次匹配。由于“end”始终以空格开头,因此永远不会使用它。我相信您的意思是“end”是单词的开头,即“<”字符。

这是一个工作版本:

sed -E 's/\<(end|END)\S*//g' file.txt

但可以稍微改进一下。在这里,我让匹配不区分大小写,以删除单词上的“或”,从而消除了对扩展正则表达式的需求。我还添加了尾随的“\s”以删除尾随空格(防止间隙中出现双空格)。

sed 's/\<END\S*\s//gi' file.txt

这是来自 GNU 的有关 sed 的指南,可供参考。

更新

根据您下面的评论,似乎我们都误解了您想要什么。听起来您不仅想删除这些文本字段,还想在文件本身中这样做。虽然我为没有提到这一点而道歉,但这是一个很好的教训,说明为什么措辞您的问题以准确询问您想要什么如此重要。

无论如何,您的解决方案(添加 > file.txt)实际上会用新文本覆盖旧文件。具体来说,sed 会将结果输出到 stdout(您的终端)。“>”符号称为重定向。它会将前面的 stdout 重定向到后面的任何内容。这实际上会删除现有文件并将其替换为新文件。

虽然这种方法可行,但并不是最好的。如果您想就地替换文件中的字符串,sed 也可以通过添加“-i”选项来为您做到这一点:

sed -i 's/\<END\S*\s//gi' file.txt

这里有一个有用的参考资料,可以帮助您有效地措辞问题。您表达的需求越精确,得到的答案就会越好!

希望这可以帮助!

答案2

在这种情况下,由于输入格式很好,可能更容易使用cut

cut -d" " -f-8,10- file.txt

解释

-d" "将字段分隔符设置为空格。默认为制表符。

-f-8,10-取第一到第八个字段,然后取第十到最后一个字段。跳过第九个字段,即以“end”开头的字段。

答案3

sed -E 's/ (end|END)[^ ]+//g' file.txt

匹配并删除一个空格,后跟 end 或 END,后跟尽可能多的非空格。

相关内容