[英]sed replace exact match
我想使用 sed 更改文件中的一些名称。 这是文件的样子:
#! /bin/bash
SAMPLE="sample_name"
FULLSAMPLE="full_sample_name"
...
现在我只想使用 sed 更改 sample_name 而不是 full_sample_name
我试过这个
sed s/\<sample_name\>/sample_01/g ...
我认为 \\<> 可用于查找完全匹配,但是当我使用它时,没有任何改变。
添加 '' 有助于仅更改 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 的值。
我相信\\<
和\\>
与 gnu sed 一起工作,你只需要引用 sed 命令:
sed -i.bak 's/\<sample_name\>/sample_01/g' file
在 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
变量不在单引号内展开,这就是为什么您要获取变量的名称而不是其内容的原因。
@用户1987607
您可以通过以下方式执行此操作:
sed s/"sample_name">/sample_01/g
其中引号“”中的“sample_name”与确切的字符串值匹配。
/g用于全局替换。
如果“sample_name”像这样 ifsample_name 出现并且您也想替换它,那么您应该使用以下内容:
sed s/"sample_name">/"sample_01"/g
这样它只替换所需的单词。 例如,上述语法将替换文本文件中的单词“the”,而不是来自诸如此类的单词。
如果您有兴趣只替换第一次出现,那么这会很好用
sed s/"sample_name"/sample_01/
希望能帮助到你
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.