在管道符之间使用未知长度的通配符进行grep筛选

3

我正在尝试使用grep命令查找以下字符串:

行必须以15开头,其余部分可以是任意长度的管道之间的数字。最后两个管道之间不能有任何内容。

"15|155702|0101|1||"

目前我已经有:

grep "^15|" $CONCAT_FILE_NAME >> "VAS-"$CONCAT_FILE_NAME

在使用[0-9]时,我遇到了指定数字长度的问题。


我忘记了补充,该字符串在CONCAT_FILE_NAME文件中。问题在于指定grep中的任何数字长度。 - user3124205
3个回答

1
假设开头必须以15|开头,总共有5个管道符(|),最后两个管道符之间没有任何内容。第2、3和4个管道符之间可以有任意数量的数字。
grep "^15\|[0-9]*\|[0-9]*\|[0-9]*\|\|$" $CONCAT_FILE_NAME >> "VAS-"$CONCAT_FILE_NAME

1
使用 awk
cat file
15|155702|0101|1||
15|155702|0101|1|test|
16|155702|0101|1||

awk -F\| '/^15/ && !$(NF-1)' file
15|155702|0101|1||

This prints a line only if it starts with 15 and the second last field, separated by | is blank

So this would be:

VAS-CONCAT_FILE_NAME=$(awk -F\| '/^15/ && !$(NF-1)' <<<"$CONCAT_FILE_NAME")

Another shorter regex that would work

awk '/^15.*\|\|$/' file

This search for all lines starting with 15 and ends with ||


@1_CR 看起来那个人移除了“-”,所以我也移除了注释。在某些情况下,grep可能更好,在其他情况下则是awk :) - Jotne

1
你需要转义符号|
grep -E '^15\|([[:digit:]]+\|)+\|$'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接