我想使用sed更改文件中的某些名称。这就是文件的样子:
#! /bin/bash
SAMPLE="sample_name"
FULLSAMPLE="full_sample_name"
...
现在我只想更改sample_name&不是使用sed的full_sample_name
我试过这个
sed s/\<sample_name\>/sample_01/g ...
我以为\&lt;&gt;可以用来找到完全匹配,但是当我使用它时,没有任何改变。
添加''有助于仅更改sample_name。但是现在还有另一个问题:我的情况比上面解释的要复杂一些,因为我的sed命令嵌入在一个循环中:
while read SAMPLE
do
name=$SAMPLE
sed -e 's/\<sample_name\>/$SAMPLE/g' /path/coverage.sh > path/new_coverage.sh
done < $1
因此,应使用附加到$ SAMPLE的值更改sample_name。但是,在运行命令时,sample_name更改为$ SAMPLE,而不是更改为附加到$ SAMPLE的值。
答案 0 :(得分:13)
我相信\<
和\>
使用gnu sed,你只需要引用sed命令:
sed -i.bak 's/\<sample_name\>/sample_01/g' file
答案 1 :(得分:4)
在GNU sed中,以下命令有效:
sed 's/\<sample_name\>/sample_01/' file
这里唯一的区别是我用单引号括起了命令。即使引用sed命令不是必要的,我也认为这样做很不利(并且它有助于避免这些问题)。
实现您想要的更便携的另一种方法是在模式和替换中添加引号:
sed 's/"sample_name"/"sample_01"/' script.sh
或者,您提出的语法也适用于GNU awk:
awk '{sub(/\<sample_name\>/, "sample_01")}1' file
如果要在替换字符串中使用变量,则必须使用双引号而不是单引号,例如:
sed "s/\<sample_name\>/$var/" file
变量不会在单引号内展开,这就是为什么要获取变量的名称而不是其内容。
答案 2 :(得分:1)
<强> @ user1987607 强>
您可以通过以下方式执行此操作:
sed s /“sample_name”&gt; / sample_01 / g
其中引号“”中的“sample_name”与精确的字符串值匹配。
/ g 是全球替代品。
如果“sample_name”出现如下ifsample_name,并且您也想要替换它 那么你应该使用以下内容:
sed s /“sample_name”&gt; /“sample_01”/ g
因此它只替换了所需的单词。例如,上面的语法将替换文本文件中的单词“the”,而不是像这样的单词。
如果您有兴趣只替换第一次出现,那么这样可以正常工作
sed s /“sample_name”/ sample_01 /
希望有所帮助