sed替换完全匹配

use*_*607 11 sed

我想使用sed更改文件中的某些名称.这是文件的样子:

#! /bin/bash

SAMPLE="sample_name"
FULLSAMPLE="full_sample_name"

...
Run Code Online (Sandbox Code Playgroud)

现在我只想使用sed更改sample_name而不是full_sample_name

我试过这个

sed s/\<sample_name\>/sample_01/g ...
Run Code Online (Sandbox Code Playgroud)

我认为\ <>可以用来找到完全匹配,但是当我使用它时,没有任何改变.

添加''有助于仅更改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
Run Code Online (Sandbox Code Playgroud)

因此,应使用附加到$ SAMPLE的值更改sample_name.但是,在运行命令时,sample_name更改为$ SAMPLE,而不是更改为附加到$ SAMPLE的值.

anu*_*ava 16

我相信\<\>使用gnu sed,你只需要引用sed命令:

sed -i.bak 's/\<sample_name\>/sample_01/g' file
Run Code Online (Sandbox Code Playgroud)

  • 你需要在sed命令中使用双引号而不是单引号来使用shell变量:`sed"s /\<sample_name \>/$ SAMPLE/g"/ path/coverage.sh` (2认同)

Tom*_*ech 6

在 GNU sed 中,以下命令有效:

sed 's/\<sample_name\>/sample_01/' file
Run Code Online (Sandbox Code Playgroud)

这里唯一的区别是我将命令括在单引号中。即使没有必要引用 sed 命令,我认为这样做也没有什么坏处(它有助于避免此类问题)。

另一种更便携地实现您想要的东西的方法是在模式和替换中添加引号:

sed 's/"sample_name"/"sample_01"/' script.sh
Run Code Online (Sandbox Code Playgroud)

或者,您提出的语法也适用于 GNU awk:

awk '{sub(/\<sample_name\>/, "sample_01")}1' file
Run Code Online (Sandbox Code Playgroud)

如果要在替换字符串中使用变量,则必须使用双引号而不是单引号,例如:

sed "s/\<sample_name\>/$var/" file
Run Code Online (Sandbox Code Playgroud)

变量不在单引号内展开,这就是为什么您要获取变量的名称而不是其内容的原因。