我有一个格式如下的文件:
A 485C72F95C72E15C EXTERNAL
B CC32480A3247F84A SYSTEM
C EC2A63F12A63B76C EXTERNAL
我想使用变量“字母”的值提供第一列中的字母,并用我在变量“id”中提供的值替换第二列中的值。在任何情况下,第三列可能不同或匹配,也可能不匹配。第一列和第二列永远不会包含空格或特殊字符。
我试过用sed
,但我的 sed-fu 不强。我想出了这个:
letter=A
id=MYNEWIDSTRING
sed "/$letter /s/[^ ]*/$id/2"
输出是:
A MYNEWIDSTRING EXTERNAL
B MYNEWIDSTRING SYSTEM
C EC2A63F12A63B76C EXTERNAL
id 被替换为两行,我假设这是由于 'A' 在原始 id 字符串的末尾匹配。
我知道使用sed -i
就地编辑文件,但还没有这样做,因为我的命令仍然有点狡猾。
我哪里出错了,或者我应该使用不同的方法?
锚定它(
^
是行首),以便A
仅当它是第一个字符时才匹配:顺便说一句,如果您想将变量传递给
sed
但您需要强引用,请记住您可以在为变量添加双引号时打开和关闭引用 - 丑陋但通常可能是最佳实践:每当您处理结构化数据时,我都会使用
awk
orperl
而不是sed
.例如
或者
较新版本的 GNU awk 有一个
-i
(--in-place
) 标志;在其他情况下,您需要使用显式临时文件;-i
perl无论如何都应该有一个。