如何在一行中搜索模式并打印该行中该模式后出现的数据

时间:2013-12-23 12:37:31

标签: linux bash shell sed awk

我的文件有不均匀的行,如下所示:

jacktyutu/ABC/uyiyi/yyuiyiu/1.java
adhjasgdhg/gsdjgf/ABC/sdfhgsdfj/sdjfhsd/sdfkjhsdkf/2.java
adhjasgdhg/01/ABC/sdfhgs/213/j/sdjfhsd/sdfkjhsdkf/3.java
sd/asd/asd/ABC/sdjg/76/987/4.java

从上面的文件中我想从每一行搜索模式ABC,然后从该行打印其余的数据

我的输出应该如下:

uyiyi/yyuiyiu/1.java
sdfhgsdfj/sdjfhsd/sdfkjhsdkf/2.java
sdfhgs/213/j/sdjfhsd/sdfkjhsdkf/3.java
sdjg/76/987/4.java

如何在shell脚本中或使用awksed

实现此目的

5 个答案:

答案 0 :(得分:1)

使用GNU Grep

$ grep -oP "(?<=ABC/).*" file
uyiyi/yyuiyiu/1.java
sdfhgsdfj/sdjfhsd/sdfkjhsdkf/2.java
sdfhgs/213/j/sdjfhsd/sdfkjhsdkf/3.java
sdjg/76/987/4.java

使用awk

$ awk -F'ABC/' '{print $2}' file
uyiyi/yyuiyiu/1.java
sdfhgsdfj/sdjfhsd/sdfkjhsdkf/2.java
sdfhgs/213/j/sdjfhsd/sdfkjhsdkf/3.java
sdjg/76/987/4.java

使用sed

$ sed 's%.*ABC/%%' file
uyiyi/yyuiyiu/1.java
sdfhgsdfj/sdjfhsd/sdfkjhsdkf/2.java
sdfhgs/213/j/sdjfhsd/sdfkjhsdkf/3.java
sdjg/76/987/4.java

答案 1 :(得分:1)

  

从上面的文件我想从每个搜索模式ABC   排除并打印来自该行的其余数据以供例外...

我愿意:

 grep -Po '.*?ABC/\K.*' file

如果一行包含多个ABC/,则此选项有用,它只选择第一个 ABC/之后的其他内容。如果需要的话。

见测试:

kent$  cat f
jacktyutu/ABC/uyiyi/yyuiyiu/1.java
adhjasgdhg/gsdjgf/ABC/sdfhgsdfj/sdjfhsd/sdfkjhsdkf/2.java
adhjasgdhg/01/ABC/sdfhgs/213/j/sdjfhsd/sdfkjhsdkf/3.java
sd/asd/asd/ABC/sdjg/76/987/4.java
foo/ABC/___here/ABC/comes again

kent$  grep -Po '.*?ABC/\K.*' f
uyiyi/yyuiyiu/1.java
sdfhgsdfj/sdjfhsd/sdfkjhsdkf/2.java
sdfhgs/213/j/sdjfhsd/sdfkjhsdkf/3.java
sdjg/76/987/4.java
___here/ABC/comes again

答案 2 :(得分:1)

只有每行中有一个ABC

perl -F"\/ABC\/" -ane 'print $F[1];' file

答案 3 :(得分:0)

强制性bash版本:

found_something=false
while read line
do
  [[ "${line}" =~ ABC/ ]] && echo "${line#*ABC/}" && found_something=true
done < file
${found_something} || echo "I didn't find any lines matching ABC/"

编辑:添加了几行来处理目标字符串不存在的情况......

答案 4 :(得分:0)

perl oneliner:

    perl -e "/ABC/;print $';"

_

    print $` 

在比赛前打印所有内容,

    print $& 

打印匹配的字符,如果您匹配模式(正则表达式),则非常有用。

sed awk 的现代版本可能有特殊的$变量,但我还没有看到。