Ответ 1
Это работает:
sed -rne 's/(dbservername)\s+\w+/\1 yyy/gip'
(Когда вы используете опцию -r, вам не нужно выходить из парнеров.)
Как заменить часть строки на sed?
Линия
DBSERVERNAME xxx
следует заменить на:
DBSERVERNAME yyy
Значение xxx может меняться, и между dbservername и значением есть две вкладки. Эта пара имен и значений является одним из многих из файла конфигурации.
Я попробовал следующую обратную ссылку:
echo "DBSERVERNAME xxx" | sed -rne 's/\(dbservername\)[[:blank:]]+\([[:alpha:]]+\)/\1 yyy/gip'
и это привело к ошибке: неверная ссылка \1 на `s 'команда RHS.
Что не так с выражением? Использование GNU sed.
Это работает:
sed -rne 's/(dbservername)\s+\w+/\1 yyy/gip'
(Когда вы используете опцию -r, вам не нужно выходить из парнеров.)
Другие уже упоминали об исключении круглых скобок, но почему вам нужна обратная ссылка вообще, если первая часть строки является постоянной?
Вы можете просто сделать
sed -e 's/dbservername.*$/dbservername yyy/g'
Вы избегаете своего (и). Я почти уверен, что вам не нужно это делать. Попробуйте:
sed -rne 's/(dbservername)[[:blank:]]+\([[:alpha:]]+\)/\1 yyy/gip'
Вы не должны избегать ситуаций, когда используете одиночные кавычки. то есть.
echo "DBSERVERNAME xxx" | sed -rne 's/(dbservername[[:blank:]]+)([[:alpha:]]+)/\1 yyy/gip'
Вы не должны избегать своих парнеров. Попробуйте:
echo "DBSERVERNAME xxx" | sed -rne 's/(dbservername)[[:blank:]]+([[:alpha:]]+)/\1 yyy/gip'
Это может сработать для вас:
echo "DBSERVERNAME xxx" | sed 's/\S*$/yyy/'
DBSERVERNAME yyy
Попробуйте это
sed -re 's/DBSERVERNAME[ \t]*([^\S]+)/\yyy/ig' temp.txt
или
awk '{if($1=="DBSERVERNAME") $2 ="YYY"} {print $0;}' temp.txt