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

时间:2016-02-01 02:47:58

标签: 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命令来做呢? 谢谢。

5 个答案:

答案 0 :(得分:2)

在诸如此类的简单场景中,您只需要cut

cut -d '[' -f1 file.txt

这只是在每行第一次出现[之前返回子字符串。

如果您的示例输出遗漏重复项不仅仅是一个意外:如果您的输入记录被分组,并且您想要清除重复项,只需输入uniq

cut -d '[' -f1 file.txt | uniq

答案 1 :(得分:1)

mklement0的答案可能是最好的,但如果你想用awk或sed做。

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

sedsed 's/\[[0-9]*\]$//' file.txt

答案 2 :(得分:1)

您还可以使用grep在开始括号之前提取零件,然后将结果传递给uniq:

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

我认为file已排序,因为您在演示数据中显示了这一点。如果不是这种情况,则需要在将输出传递给uniq之前对输出进行排序:

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

答案 3 :(得分:1)

sed的另一个选项:

sed 's/\(.[^[]*\).*/\1/g' file.txt

这使用sed分组和反向引用。 \(...\)捕获从第一行开始到[的所有内容(不包括.[^[]*)。然后它匹配剩余的字符,即。 [...]。由\(...\)分隔的第一个组可以使用\1进行反向引用。

基本上我将我要保留的内容分组并在sed命令\1的替换部分中引用它(意思是组号1)。

答案 4 :(得分:0)

还有一项删除重复项的建议。

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