我正在尝试从找到的特定模式中删除尾随单词。 示例如下所示:
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命令来做呢? 谢谢。
答案 0 :(得分:2)
在诸如此类的简单场景中,您只需要cut
:
cut -d '[' -f1 file.txt
这只是在每行第一次出现[
之前返回子字符串。
如果您的示例输出遗漏重复项不仅仅是一个意外:如果您的输入记录被分组,并且您想要清除重复项,只需输入uniq
:
cut -d '[' -f1 file.txt | uniq
答案 1 :(得分:1)
mklement0的答案可能是最好的,但如果你想用awk或sed做。
awk
:awk -F'[' '{print $1}' file.txt
sed
:sed '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