使用“sed”或“awk”在文件中查找和替换字符串

使用“sed”或“awk”在文件中查找和替换字符串

假设我有以下输入文件:

yhara.runner.mng1.nna1.X9HCJG.1 yhara.runner.mng1.nna1.Z2HCJG.1 100.000 100 
yhara.runner.mng1.nna1.X9HCJG.1 yhara.runner.mng1.nna1.AUEM0K.1 94.144  72  
yhara.runner.mng1.nna1.X9HCJG.1 yhara.runner.mng1.nna1.H5SFBV.1 93.156  72  
yhara.runner.mng1.nna1.X9HCJG.1 yhara.runner.mng1.nna1.L5AFBV.1 62.169  58  
yhara.runner.mng1.nna1.X9HCJG.1 yhara.runner.mng1.nna1.90R752.1 92.188  64  
yhara.runner.mng1.nna1.X9HCJG.1 yhara.runner.mng1.nna1.MP1IPV.1 90.278  72

我需要这个作为输出文件

yhara.runner.mng1.nna1.X9HCJG.+v1.0 yhara.runner.mng1.nna1.Z2HCJG.+v1.0 100.000 100 
yhara.runner.mng1.nna1.90R752.+v1.0 yhara.runner.mng1.nna1.AUEM7K.+v1.0 94.144  72  
yhara.runner.mng1.nna1.X9HCJG.+v1.0 yhara.runner.mng1.nna1.H5SFBV.+v1.0 93.156  72  
yhara.runner.mng1.nna1.L5AFBV.+v1.0 yhara.runner.mng1.nna1.L5AFBV.+v1.0 62.169  58  
yhara.runner.mng1.nna1.X9HCJG.+v1.0 yhara.runner.mng1.nna1.90R752.+v1.0 92.1.188 64 
yhara.runner.mng1.nna1.AUEM7K.+v1.0 yhara.runner.mng1.nna1.MP1IPV.+v1.0 90.278  72

yhara.runner.mng1.nna1.**othercode**.1在所有文件中都有通用的字符串,但我只想替换1+v1.0在字符串的末尾,就像yhara.runner.mng1.nna1.**othercode**.+v1.0 我尝试使用sed命令awk行来查找和替换一样,如下所示

awk '{print $1}' demo.txt | sed -i -e 's/.1/+v1.0/g'
awk '{print $2}' demo.txt | sed -i -e 's/.1/+v1.0/g'

但那毫无意义

谢谢

答案1

一个简单的 Perl 解决方案是:

perl -p -e 's/\.1 /+v1.0 /g' your_file.txt > replaced.txt

您也可以使用sed -e而不是perl -p -e

这会将出现的.1(带有空格) 替换为字符串+v1.0(同样带有空格)。

您可以使用该-i选项(适用于 Perl 和 sed)来就地替换文件,但请注意,sed这仅适用于 Linux,而不适用于 macOS。

答案2

问题在于您的命令是sed -i替换文件中的 ,但awk输出捕获的字符串。您可以使用 @slhck 的解决方案来解决这个问题,只需将每个 替换.1.+1.0,但为了更灵活和健壮一些(例如对于.1第 3 或第 4 列中的任何 ),我可能会像这样解决它(警告:POSIX 正则表达式快速接近):

sed -iE 's/([^[:space:]]+)([0-9])[[:space:]]+([^[:space:]]+)([0-9])/\1\+v\2.0\3\+v\4.0/' input.txt

它看起来很复杂,但当我们分解它时就不会了:

  1. [^[:space:]]+[0-9]首先匹配任意字符不是以数字结尾的空格(\s也可能有效,但并不总是受支持)。
  2. 然后我们将它们分组,以便以后引用它们([^[:space:]]+)([0-9])
  3. 之后是任意数量的空格字符[[:space:]]+
  4. 随后进行与步骤 2 中相同的匹配组

对于更换的部件,它是:

  1. \1第 1 组
  2. 打印+v
  3. \2第 2 组
  4. 打印.0
  5. 然后第 3 组和第 4 组也发生同样的事情

1如果确实总是要替换数字,也可以[0-9]简单地用替换1;如果总是要替换tab字符,可以尝试[[:space:]]用替换\t。这样会简单得多,但灵活性也会降低。

相关内容