我的文件有不均匀的行,如下所示:
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脚本中或使用awk
和sed
?
答案 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 的现代版本可能有特殊的$变量,但我还没有看到。