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
。然后在主程序中将 FS
和 OFS
设置为 |
并检查条件,如果第二个字段是 1806.10
然后将最后一个字段设置为 p7 。 1
是一种打印当前行的 awk
ish 方式。
使用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.
设置
我有一个文件,其中有些行不完整,如下例中的第二行
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
。然后在主程序中将 FS
和 OFS
设置为 |
并检查条件,如果第二个字段是 1806.10
然后将最后一个字段设置为 p7 。 1
是一种打印当前行的 awk
ish 方式。
使用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.