Подтвердить что ты не робот

Sed: Заменить часть строки

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

Линия

DBSERVERNAME     xxx

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

DBSERVERNAME     yyy

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

Я попробовал следующую обратную ссылку:

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

и это привело к ошибке: неверная ссылка \1 на `s 'команда RHS.

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

4b9b3361

Ответ 1

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

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

(Когда вы используете опцию -r, вам не нужно выходить из парнеров.)

Ответ 2

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

Вы можете просто сделать

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

Ответ 3

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

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

Ответ 4

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

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

Ответ 5

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

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

Ответ 6

Это может сработать для вас:

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

Ответ 7

Попробуйте это

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

или

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