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

时间:2017-06-28 09:05:22

标签: 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.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 

你能帮我解决一下这个问题吗?

3 个答案:

答案 0 :(得分:2)

试试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

答案 1 :(得分:2)

您可以使用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

答案 2 :(得分:1)

使用awk:

$.fn.myFunction = function (splitId) {
    var finalurl= "/Games/Random/Resources/" + myurl;
    $('#shore-5').css("background-image", 'url(' + finalurl+ ')');
} 

$(function () {
    $(this).myFunction2($('ship.JPG)'));
});

在你的情况下:

$ 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