Bash 脚本编程:如何匹配字符串中的模式?

Bash 脚本编程:如何匹配字符串中的模式?

7I45432ZX我如何从下面几行获取整个值:

PW*3434*453*256*PE*UB
PO*00*NE*7I4543
2ZX**20140617
PW*3434*453*256*PE*UB
PO*00*NE*7I4543
2ZX**20140617

这是我尝试过的代码:

grep -oP 'PO.00.[A-Z][A-Z].\K[A-Z0-9_-]*' < file.txt

我有上面的代码,但是生成的输出只有这个7I4543而不是全部7I45432ZX,这应该是我预期的输出。我是否需要修改或添加某些内容.\K才能获得完整值?

答案1

尝试以下一行代码:

$ cat file.txt | perl -e 's/\s//g && print "$_\n" for join("", <>) =~ /\*([\w\s]+)\*\*/g'
7I45432ZX
7I45432ZX

*我基本上是在寻找一颗星和两颗星之间的模式**。一旦找到,我只需在打印之前删除空格/回车符。

答案2

尝试这个:

 awk -F "*" '{ if ($1 == "PO") { lastTok = $(NF); getline; print lastTok "" $1;}}' input.txt

awk 使用“*”作为分隔符并打印以 PO 开头的行的最后一个字段,后跟下一行的第一个字段。

输出为:

7I45432ZX
7I45432ZX

如果你有 dos 格式的文件,你应该使用dos2unix命令。

答案3

通过grepsed

grep -oPz '7I4543$\n^2ZX' file |sed '$!N;s/\n//'
7I45432ZX
7I45432ZX

grep多行中的模式7I45432ZX它们之间的所有内容。$在 grep 命令中指向行尾并^指向行首。

sed将每对线连接成一条线。$指向当前行,N指向下一行。然后替换/删除\n该行之间的换行符。

-o, --only-matching
      Print only the matched (non-empty) parts of a matching line,
      with each such part on a separate output line.

-P, --perl-regexp
      Interpret PATTERN as a Perl compatible regular expression (PCRE)

-z, --null-data
      Treat the input as a set of lines, each terminated by a zero byte (the ASCII 
      NUL character) instead of a newline. Like the -Z or --null option, this option 
      can be used with commands like sort -z to process arbitrary file names.

其他可能的grep情况:

$ grep -oPz '7I4543$(^2ZX|\n)+'
$ grep -oPz '7I4543$\s^2ZX'

答案4

安装 pcregrep:

sudo apt-get install pcregrep

然后运行:

pcregrep -oM "PO.00.[A-Z][A-Z].\K[A-Z0-9_-].*\s+.*\*" < file.txt | tr -d '\n' | sed -e 's/\*\*/\n/g'

输出:

7I45432ZX
7I45432ZX

以下是脚本功能的说明。首先,我必须让原始脚本跨换行读取,然后它会在两行上输出结果,除非我也让它跨换行写入。脚本的最后一部分sed -e 's/\*\*/\n/g'在每个分隔符后放置一个换行符,这是问题作者在对此答案的评论中所要求的。

相关内容