sed:如果第二个字段与模式匹配,则用存储在变量中的值替换最后一个字段

sed: replace last field with value stored in variable if second field matches pattern

设置

我有一个文件,其中有些行不完整,如下例中的第二行

cat file1.txt

7:|18.01-18.05|Un cambio a la partida 18.01 a 18.05 de cualquier otro capítulo.
7:|1806.10|Un cambio a la subpartida 1806.10 de cualquier otra partida, siempre que el
7:|1806.20|Un cambio a la subpartida 1806.20 de cualquier otra partida.

我将完整的句子存储在一个名为 p7

的变量中
echo $p7

Un cambio a la subpartida 1806.10 de cualquier otra partida, siempre que el azúcar no originaria del Capítulo 17 no constituya más del 35 por ciento en peso del azúcar y el polvo de cacao no originario de la partida 18.05 no constituya más del 35 por ciento en peso del cacao en polvo.

期望的输出

如果第二个字段与 1806.10 匹配,我将尝试用 p7 替换最后一个字段,如下所示

cat file2.txt

7:|18.01-18.05|Un cambio a la partida 18.01 a 18.05 de cualquier otro capítulo.
7:|1806.10|Un cambio a la subpartida 1806.10 de cualquier otra partida, siempre que el azúcar no originaria del Capítulo 17 no constituya más del 35 por ciento en peso del azúcar y el polvo de cacao no originario de la partida 18.05 no constituya más del 35 por ciento en peso del cacao en polvo.
7:|1806.20|Un cambio a la subpartida 1806.20 de cualquier otra partida.

尝试失败

cat file1.txt | sed -E "s/(7:\|1806\.10\|\|)(.*)$/${p7}/g" > file2.txt

不替换 p7 的第三个字段。

2.

cat file1.txt | sed -z "s/(7:\|1806\.10\|\|)(.*)$/${p7}/g" > file2.txt

给出错误 sed: -e expression #1, char 320: invalid reference on s' 命令的 RHS`。

3.

cat file1.txt | sed -z "s/7:\|1806\.10\|\|.*/7:\|1806\.10\|\|${p7}/g" > file2.txt

替换最后一个字段但删除文件中的所有其他内容。

我做错了什么?

这个简单的 awk 程序同样可以帮助您。这确实是一项 awk 任务,与 sed 恕我直言相比,在这里会更容易处理。

##Shell variable which has test value shown by OP.
p7="Un cambio a la subpartida 1806.10 de cualquier otra partida, siempre que el azúcar no originaria del Capítulo 17 no constituya más del 35 por ciento en peso del azúcar y el polvo de cacao no originario de la partida 18.05 no constituya más del 35 por ciento en peso del cacao en polvo."

awk 代码需要 运行 为:

awk -v p7="$p7" 'BEGIN{FS=OFS="|"} ==1806.10{$NF=p7} 1' Input_file

解释: 简单的解释就是,将 shell 变量 p7 传递给 awk其变量名也是p7。然后在主程序中将 FSOFS 设置为 | 并检查条件,如果第二个字段是 1806.10 然后将最后一个字段设置为 p7 。 1 是一种打印当前行的 awkish 方式。

使用sed

$ sed "/[^|]*|1806.10/{s/\(\([^|]*|\)\{2\}\).*/$p7/}" input_file
7:|18.01-18.05|Un cambio a la partida 18.01 a 18.05 de cualquier otro capítulo.
7:|1806.10|Un cambio a la subpartida 1806.10 de cualquier otra partida, siempre que el azúcar no originaria del Capítulo 17 no constituya más del 35 por ciento en peso del azúcar y el polvo de cacao no originario de la partida 18.05 no constituya más del 35 por ciento en peso del cacao en polvo.
7:|1806.20|Un cambio a la subpartida 1806.20 de cualquier otra partida.