Я планирую заменить определенные строки в файле, поэтому использую sed.
Я хотел бы заменить строку, в то время как вместо этого sed считывает строку и добавляет текст в середину строки.
Пример:
string in myfile : user=blabla
string that I want to obtain: user=bob
поэтому я запускаю sed таким образом, чтобы он искал строку "user=" и заменял ее на "user=bob"
sed -i 's/user=*/user=bob/' myfile
Что я получаю, так это
user=bobblabla
По сути, sed думает, что я хочу заменить только эту часть, в то время как я хочу заменить всю строку новой строкой. Я думал, что * скажет sed рассмотреть все, что идет после, но это не работает.
Поскольку я не знаю, что будет "blabla", я не могу вставить это в команду sed. Как мне сказать sed найти строку, которая начинается с "user=" и заменить всю строку новой?
решение1
Похоже, вы путаете шаблоны оболочки с регулярными выражениями. В шаблоне оболочки *
означает ноль или более любых символов. В регулярном выражении, которое sed
ожидается в его шаблонах, *
означает ноль или более предыдущих атомов. В вашем примере этим атомом является =
. Таким образом, sed
ищет за которым user
следует ноль или более =
и заменяет соответствующую строку на user=bob
. Нужный вам шаблон — user=.*
, user=
за которым следует любой символ ( .
) ноль или более раз, что делает вашу sed
команду:
sed -i 's/user=.*/user=bob/' myfile
решение2
Как сказал GaryJohn, вы ошиблись в регулярном выражении. (* -> .*)
Но я бы пошел немного дальше, раз уж вы этим занялись... Я не знаю, как на самом деле выглядит ваш файл, но просто ради практики я бы рассмотрел возможность сделать вашу операцию поиска/замены немного безопаснее.
Допустим, вы хотите запустить эту штуку над таким файлом:
user=john
superuser=jimmy # don't want to change this line!
user=L33t_us3rn4m3 # that should work too, and these comments should remain intact as well, btw
# in the line below, I want to change user=hello to user=bob
# but in the comments, "user=hello" should remain intact
user=hello
С вашим текущим синтаксисом sed это будет совсем неправильно. Чтобы сделать это немного конкретнее, вы можете попробовать:
sed -i 's/^user=[A-Za-z0-9_]*/user=bob/g' /tmp/myfile
Это будет:
- срабатывает только тогда, когда строка действительно начинается с «пользователь» (^)
- Измените только "user=", если он состоит из 0 или более букв, цифр или подчеркиваний.
- оставить все после имени пользователя (т.е. комментарии в моем примере) нетронутым
Это ни в коем случае не супербезопасная вещь, которая будет работать всегда и везде, где вы хотите переименовать пользователей. Очевидно, это зависит от того, как настроен ваш файл конфигурации и чего вы ожидаете. Но мой ответ призван дать немного "пищи для размышлений", потому что, учитывая (количество) файлов конфигурации, достаточно больших, чтобы ожидать, что так много имен пользователей не захотят делать это вручную, слепая замена "user=.*" кажется потенциально опасной. Вы можете потратить некоторое время на полировку этих видов операций :)
Удачи.