替换bash中包含特定字符串的所有行中的第二个条目

替换bash中包含特定字符串的所有行中的第二个条目,bash,sed,replace,Bash,Sed,Replace,我想替换包含特定字符串的所有行(空格或制表符分隔)的第二个条目。在下文中 1078.732700000 0.00001000 1 0 0 39 13 27 0 0 0 40 14 26 81SaWoLa.43 BAD LABEL, REASSIGNED -1077.336700000 0.00001000 1 0 0 45 12 34 0 0 0 46 13 34 81SaWoLa.48 BAD LABEL 我想将0.00001000替换为0.00005214(搜索字符串81SaWoLa

我想替换包含特定字符串的所有行(空格或制表符分隔)的第二个条目。在下文中

1078.732700000 0.00001000 1 0 0 39 13 27 0 0 0 40 14 26 81SaWoLa.43 BAD LABEL, REASSIGNED 

-1077.336700000 0.00001000 1 0 0 45 12 34 0 0 0 46 13 34 81SaWoLa.48 BAD LABEL 
我想将
0.00001000
替换为
0.00005214
(搜索字符串
81SaWoLa
)。结果应该是

1078.732700000 0.00005214 1 0 0 39 13 27 0 0 0 40 14 26 81SaWoLa.43 BAD LABEL, REASSIGNED 

-1077.336700000 0.00005214 1 0 0 45 12 34 0 0 0 46 13 34 81SaWoLa.48 BAD LABEL 

您能帮助我如何执行吗?

请为GNU sed尝试以下操作:

$ cat input.txt 
1078.732700000 0.00001000 1 0 0 39 13 27 0 0 0 40 14 26 81SaWoLa.43 BAD LABEL, REASSIGNED 

-1077.336700000 0.00001000 1 0 0 45 12 34 0 0 0 46 13 34 81SaWoLa.48 BAD LABEL
$ sed -r '/81SaWoLa/s/^([^ \t]+[ \t]+)[^ \t]+(.*)/\10.00005214\2/' input.txt 
1078.732700000 0.00005214 1 0 0 39 13 27 0 0 0 40 14 26 81SaWoLa.43 BAD LABEL, REASSIGNED 

-1077.336700000 0.00005214 1 0 0 45 12 34 0 0 0 46 13 34 81SaWoLa.48 BAD LABEL

为GNU sed尝试以下操作:

$ cat input.txt 
1078.732700000 0.00001000 1 0 0 39 13 27 0 0 0 40 14 26 81SaWoLa.43 BAD LABEL, REASSIGNED 

-1077.336700000 0.00001000 1 0 0 45 12 34 0 0 0 46 13 34 81SaWoLa.48 BAD LABEL
$ sed -r '/81SaWoLa/s/^([^ \t]+[ \t]+)[^ \t]+(.*)/\10.00005214\2/' input.txt 
1078.732700000 0.00005214 1 0 0 39 13 27 0 0 0 40 14 26 81SaWoLa.43 BAD LABEL, REASSIGNED 

-1077.336700000 0.00005214 1 0 0 45 12 34 0 0 0 46 13 34 81SaWoLa.48 BAD LABEL

您可以使用
awk
更轻松地实现您的目标

$ awk '/81SaWoLa/{$2="0.00005214"}1' file
1078.732700000 0.00005214 1 0 0 39 13 27 0 0 0 40 14 26 81SaWoLa.43 BAD LABEL, REASSIGNED

-1077.336700000 0.00005214 1 0 0 45 12 34 0 0 0 46 13 34 81SaWoLa.48 BAD LABEL
对于要使用的变量,使用命令如下:

$ var1=81SaWoLa
$ var2=0.00005214
$ awk -v var1=$var1 -v var2=$var2 '$0 ~ var1{$2=var2}1' file
1078.732700000 0.00005214 1 0 0 39 13 27 0 0 0 40 14 26 81SaWoLa.43 BAD LABEL, REASSIGNED

-1077.336700000 0.00005214 1 0 0 45 12 34 0 0 0 46 13 34 81SaWoLa.48 BAD LABEL

您可以使用
awk
更轻松地实现您的目标

$ awk '/81SaWoLa/{$2="0.00005214"}1' file
1078.732700000 0.00005214 1 0 0 39 13 27 0 0 0 40 14 26 81SaWoLa.43 BAD LABEL, REASSIGNED

-1077.336700000 0.00005214 1 0 0 45 12 34 0 0 0 46 13 34 81SaWoLa.48 BAD LABEL
对于要使用的变量,使用命令如下:

$ var1=81SaWoLa
$ var2=0.00005214
$ awk -v var1=$var1 -v var2=$var2 '$0 ~ var1{$2=var2}1' file
1078.732700000 0.00005214 1 0 0 39 13 27 0 0 0 40 14 26 81SaWoLa.43 BAD LABEL, REASSIGNED

-1077.336700000 0.00005214 1 0 0 45 12 34 0 0 0 46 13 34 81SaWoLa.48 BAD LABEL
使用awk:

$ awk '/pattern/ { $2 = "new string." }; 1' input.txt
就你而言:

$ awk '/81SaWoLa/ { $2 = "0.00005214" }; 1' input.txt
#      ^^^^^^^^^^   ^^^^^^^^^^^^^^^^^    ^
#      For lines    Replace second       Print each line, same as:
#      matching     column with          ``{ print $0 }''. ``$0''
#      81SaWoLa     ``0.00005214''       contains the whole line.
使用
-v name=val
指定变量:

$ awk -v pat="81SaWoLa"   \
      -v rep="0.00005214" \
      '$0 ~ pat { $2 = rep }; 1' input.txt
使用awk:

$ awk '/pattern/ { $2 = "new string." }; 1' input.txt
就你而言:

$ awk '/81SaWoLa/ { $2 = "0.00005214" }; 1' input.txt
#      ^^^^^^^^^^   ^^^^^^^^^^^^^^^^^    ^
#      For lines    Replace second       Print each line, same as:
#      matching     column with          ``{ print $0 }''. ``$0''
#      81SaWoLa     ``0.00005214''       contains the whole line.
使用
-v name=val
指定变量:

$ awk -v pat="81SaWoLa"   \
      -v rep="0.00005214" \
      '$0 ~ pat { $2 = rep }; 1' input.txt

您可以在问题中粘贴输入和预期输出。您可以在问题中粘贴输入和预期输出。如果
81SaWoLa
0.00005214
是变量,如何执行此操作?我尝试了
awk/$var1/{$2=$var2};1“input.txt
,但不起作用。如果
81SaWoLa
0.00005214
是变量,该如何执行?我尝试了
awk/$var1/{$2=$var2};1“input.txt
,但它不起作用。如果81SaWoLa和0.00005214是变量,如何执行它?我尝试了awk/$var1/{$2=$var2};1“input.txt,但它不起作用。我可以就地执行它吗(使用var1和var2)?@Roloka,您可以使用修改后的答案来执行它。您似乎试图直接执行
awk
的结果,这是不可能的。显示您的命令导致失败。抱歉,我发现“input.txt”已被执行。。。因此,没有问题。是否可以“就地”使用awk?如果81SaWoLa和0.00005214是变量,如何执行?我尝试了awk/$var1/{$2=$var2};1“input.txt,但它不起作用。我可以就地执行它吗(使用var1和var2)?@Roloka,您可以使用修改后的答案来执行它。您似乎试图直接执行
awk
的结果,这是不可能的。显示您的命令导致失败。抱歉,我发现“input.txt”已被执行。。。因此,没有问题。是否可以使用awk“就地”?
perl-a-F'\s+'-lne'$F[1]=“0.00005214”if/1SaWoLa/;打印“@F”文件
|如果需要就地编辑,请添加
-i
perl-a-F'\s+'-lne'$F[1]='0.00005214'if/1SaWoLa/;打印“@F”文件
|如果需要就地编辑,请添加
-i