如何在使用awk/sed unix命令找到特定模式后删除尾随词?

如何在使用awk/sed unix命令找到特定模式后删除尾随词?,unix,awk,sed,Unix,Awk,Sed,我试图从找到的特定模式中删除尾随词。 示例如下所示: file.txt a/b/c/d/susan[123] a/b/c/d/susan[456] a/b/c/d/susan[890] s/t/u/v/adam[12] s/t/u/v/adam[50] 我希望文件的结果是: a/b/c/d/susan s/t/u/v/adam 如何使用awk/sed命令执行此操作? 谢谢。在这样一个简单的场景中,剪切就是您所需要的: cut -d '[' -f1 file.txt 这只是返回每行上第一次出

我试图从找到的特定模式中删除尾随词。 示例如下所示:

file.txt
a/b/c/d/susan[123]
a/b/c/d/susan[456]
a/b/c/d/susan[890]
s/t/u/v/adam[12]
s/t/u/v/adam[50]
我希望文件的结果是:

a/b/c/d/susan
s/t/u/v/adam
如何使用awk/sed命令执行此操作?
谢谢。

在这样一个简单的场景中,剪切就是您所需要的:

cut -d '[' -f1 file.txt
这只是返回每行上第一次出现[之前的子字符串

如果您的示例输出遗漏了重复项不仅仅是一个意外:如果您的输入记录是这样分组的,并且您希望删除重复项,只需通过管道连接到uniq:


mklement0的答案可能是最好的,但是如果您想使用awk或sed来实现它的话

awk:awk-F'[''{print$1}'file.txt


sed:sed的/\[[0-9]*\]$/'file.txt

一项删除重复项的建议

awk -F'[[]' '/12/{print $1}' file
a/b/c/d/susan
s/t/u/v/adam

您还可以使用grep提取开口支架之前的零件,然后将结果传输到uniq:

grep -Eo '^[^[]+' file | uniq
我假设该文件已排序,因为您在演示数据中显示了这一点。如果不是这样,则需要在将输出传递给uniq之前对其进行排序:

grep -Eo '^[^[]+' file | sort | uniq

sed的另一个选项:

sed 's/\(.[^[]*\).*/\1/g' file.txt
这使用sed分组和反向引用。\…\捕获从行首到[不包括它:.[^[]*]的任何内容。然后它匹配剩余的字符,即[…]。然后可以使用\1反向引用由\…\分隔的第一个组


基本上,我将我想要保留的内容分组,并在sed命令的替换部分引用它,这意味着组号1。

添加一个快速的解释如何工作如何?这个答案被自动标记为低质量,这并不是真的-但只有代码的答案往往会被标记。谢谢。我不知道。我建议使用anchori在字符串的开头使用正则表达式以明确目的,并删除不必要的g:sed/^\.[^[]*\.*/\1/'file.txt老实说,根据是否包含文字12来检测重复项是一个糟糕的想法-除非您必须处理的所有输入恰好是问题中的样本数据。++;这两个命令都能很好地处理样本输入数据,但值得注意的是,sed命令不仅使用了互补的approach to the awk命令-它删除了从第一个[]开始的所有内容,但也有更严格的限制,只匹配[]之后的零个或多个数字,并要求结束]。感谢添加。我也想删除重复项。感谢mklement0事实上,我有不同位的示例100信号,但在这100个信号中,它们可以分为几个组,请直接更新您的答案以澄清删除重复项的要求,并添加一条您稍后澄清的注释,以避免重复验证现有答案。关于bits分组:我建议您提出一个新问题,并提供足够的详细信息。今后,请尝试提前说明您的所有要求。
sed 's/\(.[^[]*\).*/\1/g' file.txt