bash:如何搜索某些文本并从文件中删除?

时间:2017-02-14 09:07:17

标签: shell sed

我有一个这样的文本文件:

20173041 user name build/release/src/file1.cpp
20173041 John build/debug/master/file1.cpp
20173041 J.F.K build/test/testsrc/file1.cpp
20173041 uk us build/profile/branch/file1.cpp

我希望消除所有" build / xxxx /"从每一行得到一个这样的文件:

20173041 user name src/file1.cpp
20173041 John master/file1.cpp
20173041 J.F.K testsrc/file1.cpp
20173041 uk us branch/file1.cpp

删除的文本始终以" build"开头。怎么做?

3 个答案:

答案 0 :(得分:1)

使用GNU sed regEx模式搜索模式。请注意字段分隔符更改为|,以避免在搜索模式中使用/时转义。

sed -r 's|build/[[:alnum:]]+/||g' file2
20173041 user name src/file1.cpp
20173041 John master/file1.cpp
20173041 J.F.K testsrc/file1.cpp
20173041 uk us branch/file1.cpp

添加-i.bak

sed -i.bak -r 's|build/[[:alnum:]]+/||g' file2

答案 1 :(得分:1)

你也可以使用像这样的多个分隔符来使用awk:

$ echo "20173041 user name build/release/src/file1.cpp" |awk -F"[ /]" '{print $1,$2,$3,$6"/"$7}'
20173041 user name src/file1.cpp

答案 2 :(得分:1)

awk -F/ '{sub(/ build/,"")}{print $1,$(NF-1)"/"$NF}' file

20173041 user name src/file1.cpp
20173041 John master/file1.cpp
20173041 J.F.K testsrc/file1.cpp
20173041 uk us branch/file1.cpp