sed替换完全匹配

时间:2014-11-10 18:50:46

标签: sed

我想使用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的值。

3 个答案:

答案 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 /

希望有所帮助