簡體   English   中英

sed 替換完全匹配

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM