2009-07-02 102 views
32

如何用sed替換行的一部分?sed:替換行的一部分

DBSERVERNAME  xxx 

應更換到:

DBSERVERNAME  yyy 

值XXX可以變化,有DBSERVERNAME和值之間的兩個突出部。該名稱 - 值對是來自配置文件的許多對中的一個。

我試圖與下面的反向引用:

echo "DBSERVERNAME xxx" | sed -rne 's/\(dbservername\)[[:blank:]]+\([[:alpha:]]+\)/\1 yyy/gip' 

並且導致錯誤:上`s'的命令的RHS無效引用\ 1。

這個表達有什麼問題?使用GNU sed。

回答

39

這工作:

sed -rne 's/(dbservername)\s+\w+/\1 yyy/gip' 

(當使用-r選項,你沒有逃跑的括號。)

+2

我知道你們在shell命令方面有很多經驗......但請儘可能的關心有抱負的linux noobs ....需要解釋....'裏面的所有內容......或者我必須通過整個[doc](https://www.gnu.org/software/sed/manual/sed.html) – Mahesha999 2017-05-20 07:41:51

2

你正在逃避你的(和)。我很肯定你不需要那樣做。嘗試:

 
sed -rne 's/(dbservername)[[:blank:]]+\([[:alpha:]]+\)/\1 yyy/gip' 
1

當你使用單引號時,你不應該逃避事物。即。

echo "DBSERVERNAME xxx" | sed -rne 's/(dbservername[[:blank:]]+)([[:alpha:]]+)/\1 yyy/gip' 
1

你不應該逃避你的parens。嘗試:

echo "DBSERVERNAME xxx" | sed -rne 's/(dbservername)[[:blank:]]+([[:alpha:]]+)/\1 yyy/gip' 
7

其他人已經提到的轉義圓括號,但爲什麼你需要一個反向引用,如果該行的第一部分是恆定的?

你可以簡單地做

sed -e 's/dbservername.*$/dbservername yyy/g' 
+1

好點!我剛剛學會了使用正則表達式+ sed,只是決定'正則表達式'看到這個特定的任務,然後'jwz'說'我有兩個問題'(儘管不直接由於正則表達式):) – calvinkrishy 2009-07-04 19:40:49

1

這可能會爲你工作:

echo "DBSERVERNAME  xxx" | sed 's/\S*$/yyy/' 
DBSERVERNAME  yyy 
0

試試這個

sed -re 's/DBSERVERNAME[ \t]*([^\S]+)/\yyy/ig' temp.txt

或本

awk '{if($1=="DBSERVERNAME") $2 ="YYY"} {print $0;}' temp.txt