在存在字符串的每一行的末尾添加一个字符串

时间:2017-11-12 22:02:39

标签: bash shell

我想在文件的每一行中添加一个字符串,其中每一行都包含特殊模式列表中的值。

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

请帮忙

2 个答案:

答案 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
相关问题