假设我有以下输入文件:
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
它看起来很复杂,但当我们分解它时就不会了:
[^[:space:]]+[0-9]
首先匹配任意字符不是以数字结尾的空格(\s
也可能有效,但并不总是受支持)。- 然后我们将它们分组,以便以后引用它们
([^[:space:]]+)([0-9])
- 之后是任意数量的空格字符
[[:space:]]+
- 随后进行与步骤 2 中相同的匹配组
对于更换的部件,它是:
\1
第 1 组- 打印
+v
\2
第 2 组- 打印
.0
- 然后第 3 组和第 4 组也发生同样的事情
1
如果确实总是要替换数字,也可以[0-9]
简单地用替换1
;如果总是要替换tab
字符,可以尝试[[:space:]]
用替换\t
。这样会简单得多,但灵活性也会降低。