我想在文件的每一行中添加一个字符串,其中每一行都包含特殊模式列表中的值。
1-我将文件的输出保存在var:
中var5 = $(cat information.txt)
OK|2017-11-03|10:00:00.000|03-NOV-17|0151114201|PF15_ZZZZ-D|05|NVBOR701
OK|2017-11-03|10:00:00.000|03-NOV-17|0151111164|PF95_TESV-D|05|NVBAY701
OK|2017-11-03|10:00:00.000|03-NOV-17|0159321163|PF15_ZZZZ-D|05|NVBOR701
OK|2017-11-03|10:00:00.000|03-NOV-17|0151112626|PF95_AWAW-D|05|NVBAY701
2-我的模式列表是:
list_of_pattern="0151114201
0151112626"
3-我希望在每行末尾添加的字符串是:
string="|R12"
我试试这个但没有结果:
[[ "$var5" =~ $list_of_pattern ]] && var5+=$string
echo "$var5"
我想要这个输出:
OK|2017-11-03|10:00:00.000|03-NOV-17|0151114201|PF15_ZZZZ-D|05|NVBOR701|R12
OK|2017-11-03|10:00:00.000|03-NOV-17|0151111164|PF95_TESV-D|05|NVBAY701
OK|2017-11-03|10:00:00.000|03-NOV-17|0159321163|PF15_ZZZZ-D|05|NVBOR701
OK|2017-11-03|10:00:00.000|03-NOV-17|0151112626|PF95_AWAW-D|05|NVBAY701|R12
请帮忙
答案 0 :(得分:2)
我建议您使用文本处理工具,例如awk。
如果您可以一次将模式传递给awk,那么您的脚本可能是这样的:
awk -F'|' -v p1="0151114201" -v p2="0151112626" '$5 == p1 || $5 == p2 {
$0 = $0 FS "R12"
} 1' file
如果第五个字段包含其中一个模式,则将另一个包含R12
的字段添加到该行的末尾。最后1
表示所有内容都会被打印出来。
如果要匹配行中任何位置的其中一个模式,请将$5 ==
(第五个字段等于)更改为$0 ~
(行匹配正则表达式)。
如果您实际上有两个以上的字符串要匹配,可以在处理文件之前将它们读入数组:
awk -F'|' 'NR == FNR { s[$0]; next } # set keys for each line in the first input
$5 in s { $0 = $0 FS "R12" } 1' patterns file
这假设要匹配的字符串位于名为patterns
的文件中,但您也可以根据需要使用流程替换,将patterns
更改为<(command_to_produce_patterns)
(在您的示例中)可能是<(echo "$list_of_pattern")
)。
答案 1 :(得分:0)
您的list_of_patterns
需要在=~
的右侧使用正则表达式。因此,以下内容适当地发出您声明的输出:
pattern='([|]|^)(0151114201|0151112626)([|]|$)'
string="|R12"
while read -r line; do
[[ $line =~ $pattern ]] && line+='|R12'
printf '%s\n' "$line"
done <<EOF
OK|2017-11-03|10:00:00.000|03-NOV-17|0151114201|PF15_ZZZZ-D|05|NVBOR701
OK|2017-11-03|10:00:00.000|03-NOV-17|0151111164|PF95_TESV-D|05|NVBAY701
OK|2017-11-03|10:00:00.000|03-NOV-17|0159321163|PF15_ZZZZ-D|05|NVBOR701
OK|2017-11-03|10:00:00.000|03-NOV-17|0151112626|PF95_AWAW-D|05|NVBAY701
EOF