2009-07-02 9 views
32

Как заменить часть строки на sed?sed: Заменить часть строки

Линия

DBSERVERNAME  xxx 

следует заменить на:

DBSERVERNAME  yyy 

Значение ххх может изменяться и есть две вкладки между DBSERVERNAME и значением. Эта пара имя-значение является одной из многих из файла конфигурации.

Я попытался с помощью следующей обратной ссылки:

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

и что привело к ошибке: недопустимый ссылка \ 1 на RHS команда `S'в.

Что не так с выражением? Использование GNU sed.

ответ

39

Это работает:

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

(При использовании опции -r, вы не должны избежать скобки.)

+2

Я знаю, что у вас, ребята, много опыта в командах оболочки ... но, пожалуйста, позаботьтесь о том, чтобы как можно больше стремились linux noob .... все внутри '' '' нужно объяснять .... или мне нужно пройдите через весь [doc] (https://www.gnu.org/software/sed/manual/sed.html) – Mahesha999

2

Вы избегаете своих (и). Я почти уверен, что вам не нужно это делать. Попытайтесь:

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

Вы не должны избегать вещей, когда используете одиночные кавычки. то есть.

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

Вы не должны избегать своих парнеров. Попробуйте:

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

Другие уже упоминали вытекание из скобки, но зачем вам нужна обратная ссылка вообще, если первая часть строки постоянна?

Вы могли бы просто сделать

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

Хороший вопрос! Я только что узнал об использовании regexps + sed и mind, просто решил «regexp» увидеть эту конкретную задачу, а затем, поскольку «jwz» сказал «у меня было две проблемы» (хотя и не напрямую из-за регулярных выражений) :) – calvinkrishy

+0

Это получает мой голос потому что это простейшее решение простой проблемы. Использование backreference спасло бы вас от опечатки двух копий 'dbservername'. Это очевидно здесь, но когда я изменяю postgresql.conf в sed, мне сложно сразу увидеть, набрал ли я 'listen_address' или' listen_addresses' (postgresql.conf).Оба выглядят правдоподобными, но только один правильный. –

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

Смежные вопросы