2

Я планирую заменить определенные строки в файле; поэтому я использую 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 рассмотреть все, что будет после, но это не работает.

Поскольку я не знаю, что такое "блабла", я не могу поставить ее в команду sed. Как сказать sed найти строку, начинающуюся с «user =», и заменить всю строку новой?

2 ответа2

5

Вы, кажется, путаете шаблоны оболочки с регулярными выражениями. В шаблоне оболочки * означает ноль или более любого символа. В регулярном выражении, которое sed ожидает в своих шаблонах, * означает ноль или более предыдущего атома. В вашем примере этот атом = . Итак, sed ищет user за которым следует ноль или более = и заменяет совпадающую строку на user=bob . Шаблон, который вы хотите, это user=.* , То есть user= за которым следует любой символ (.) Ноль или более раз, делая вашу команду sed :

sed -i 's/user=.*/user=bob/' myfile
2

Как сказал ГэриДжон, вы неправильно поняли регулярное выражение. (* ->.*)

Но я бы пошел немного дальше, пока вы на это ... Я не знаю, как на самом деле выглядит ваш файл, но просто для практики я бы хотел сделать вашу операцию поиска / замены немного более безопасной.

Скажем, вы хотите запустить вещь через файл, подобный этому:

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 =. * "кажется, возможно, опасно. Вы можете потратить некоторое время на полировку таких операций :)

Удачи.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .