SED:如果第二个字段匹配模式,则将最后一个字段替换为可变中的值

发布于 2025-01-24 13:23:20 字数 1786 浏览 2 评论 0原文

设置

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

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.

所需输出的

变量中,我试图用<<代码> p7 如果第二个字段匹配1806.10如下以下

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\|\|)(.*)$/\1${p7}/g" > file2.txt

不会替换p7的第三个字段。

2。

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

给出错误sed:-e表达式#1,char 320: s'命令的rhs rhs“无效参考\ 1。

3。

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

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

我在做什么错?

Setup

I have a file with some lines which are incomplete, like the second one in the following example

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.

I stored the full sentence in a variable called 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.

Desired output

I'm trying to replace the last field with p7 if the second field matches 1806.10 as follows

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.

Failed attempts

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

doesn't replace the third field for p7.

2.

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

gives the error sed: -e expression #1, char 320: invalid reference \1 ons' command's RHS`.

3.

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

replaces the last field but erases everything else in the file.

What am I doing wrong?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

幼儿园老大 2025-01-31 13:23:20

这个简单的awk程序可以在同一过程中为您提供帮助。这实际上是一个awk任务,在此处更容易处理与sed IMHO相比。

##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="|"} $2==1806.10{$NF=p7} 1' Input_file

说明: 简单说明将是,将Shell变量P7传递到<代码> awk 其变量名是p7。然后在主程序设置中作为P7。 1awk打印当前行的方法。

This simple awk program could help you in same. This is really an awk task, would be easier to handle in here compare to sed IMHO.

##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 code needed to be run would be:

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

Explanation: Simple explanation would be, passing shell variable p7 into awk whose variable name is also p7. Then in main program setting FS and OFS as | and checking condition if 2nd field is 1806.10 then setting last field as p7 to it. 1 is an awkish way to print current line.

忆悲凉 2025-01-31 13:23:20

使用sed

$ sed "/[^|]*|1806.10/{s/\(\([^|]*|\)\{2\}\).*/\1$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.

Using sed

$ sed "/[^|]*|1806.10/{s/\(\([^|]*|\)\{2\}\).*/\1$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.
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文