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
通过grep
和sed
:
grep -oPz '7I4543$\n^2ZX' file |sed '$!N;s/\n//'
7I45432ZX
7I45432ZX
grep
多行中的模式7I4543
和2ZX
它们之间的所有内容。$
在 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'
在每个分隔符后放置一个换行符,这是问题作者在对此答案的评论中所要求的。