我在一个目录中有一组文件。每个文件都会有一行叫做---PUBG-xxxxx--
or ---PUBG-xxxxx, PUBG-yyyyy ----
。下面是 grep 命令的输出。
grep "^--" FILE*.sql | grep "PUBG"
FILE1.sql:---PUBG-10901--
FILE2.sql:---PUBG-11617--
FILE3.sql:---PUBG-11625--
FILE4.sql:--PUBG-11724--
FILE5.sql:---PUBG-11720, PUBG-11406---
FILE6.sql:---PUBG-11403---
FILE7.sql:---PUBG-12021--
FILE8.sql:---PUBG-12207--
FILE9.sql:---PUBG-12270--
FILE10.sql:---PUBG-12552--
FILE11.sql:--- PUBG-14284--
FILE12.sql:--- PUBG-10908--
FILE13.sql:--- PUBG-15136---
FILE14.sql:--- PUBG-15163---
FILE15.sql:--- PUBG-15166---
FILE16.sql:-- PUBG-15059 --
FILE17.sql:-- PUBG-15252 --
PUBG 及其编号是随机的。我需要的只是文件名及其关联的 PUBG 值,而不需要任何--
之前或之后的 PUBG 及其值。也可以有多个 PUBG,就像FILE5.sql:---PUBG-11720, PUBG-11406---
. 我已经编写了下面的 for 循环集。
for (i in `grep "^--" FILE*.sql | grep "PUBG"`)
do
FILE_NAME=`echo ${i} | awk -F ":" {'print $1'}`
PUBG_NO=`echo ${i} | awk -F "PUBG-" {'print "PUBG-" $2'}`
echo ${FILE_NAME}
echo ${PUBG_NO}
done
但示例输出 forPUBG_NO
是PUBG-15166---
forFILE15.sql
并且是PUBG-11720,
for FILE5.sql
。
我需要特定 FILE_NAME 的文件中的所有 PUBG 值,而没有任何--
. FIlE5.sql 的 PUBG 值可以是PUBG-11720, PUBG-11406
如何改进此循环以获取准确的结果。
您不需要编写循环。您可以将输出通过管道传输到 sed。我的尝试如下:
哪个会给
在这里,我使用了一个 sed 替代命令,其形式为
进一步分解命令:
您还可以将这些概念应用于您的初始 grep 命令以仅执行一次搜索。
跟随 AWK:
将给出这个输出:
只考虑了 5 个文件:
这将遍历原始 SQL 文件并替换您的管道。
该
awk
代码提取所有以字符串开头--
并包含字符串的行PUBG
。对于每个这样的行,它会遍历以逗号分隔的条目,并从每个条目的开头和结尾去除任何破折号和空格字符。修剪后,它会打印结果PUBG-NNNN
字符串,该字符串前面带有它所在的文件名。