Sed - заменить символ в соответствующей строке на месте?


21

В файле, содержащем такие строки:

# lorem ipsum blah variable

Я хотел бы удалить #(комментарий) символ в той же строке, которая содержит конкретную строку, на месте. Это sedхорошо для этого?

Я изо всех сил пытаюсь заставить это условно работать. У меня есть "неуклюжий" способ сделать это; Я могу найти соответствующий номер строки с помощью awkили, sedа затем использовать этот номер в отдельной sedкоманде, но я считаю, что это можно сделать намного лучше.

Ответы:


36

Используйте искомую строку в качестве селектора для строк, с которыми нужно работать:

sed '/ipsum/s/#//g'

/ipsum/выбирает строки, содержащие «ipsum», и только на этих строках выполняются следующие команды. Вы можете использовать фигурные скобки для запуска большего количества команд

/ipsum/{s/#//g;s/@/-at-/g;}

4
Я согласен; это лучший ответ (хотя и не единственный). Комментарии: (1) 's/#//g'удалит все те #символы в строке. Если это не то, что вы хотите, удалите g(что означает «глобальный»). (2) Чтобы редактировать файл на месте (как указано в вопросе), используйте sed -i.
G-Man говорит: «Восстановите Монику»

2
(3) В реальных ситуациях, если вы хотите откомментировать строку, вы можете использовать ее sed -i '/ipsum/s/#[[:space:]]*//', чтобы избавиться от пробелов и табуляций, следующих сразу за #. (4) Вы также можете рассмотреть возможность проверки того, что #это первый непустой символ в строке. Текущая команда удалит #из строки prompt "Enter # of ipsums:".
G-Man говорит: «Восстановите Монику»

1
@ G-Man - отличное дополнение! На ваш 2-й пункт (ведущий пробел), как насчет: sed -i '/ipsum/s/^#[[:space:]]*//'?! ( ^означает начало строки, $для конца строки) - по крайней мере, в gnu sed ...
Джереми Дэвис

1
@JeremyDavis: Да, вы можете привязать регулярное выражение к началу строки ^, но это было бы неправильно. Я часто закомментирую код с отступом, помещая #непосредственно перед кодом, поэтому #отступ. Я сомневаюсь, что я единственный человек, который делает это.
G-Man говорит «Восстановить Монику»

1
@ G-Man - ну да, конечно! Спасибо, я не учел это. Таким образом , вы также хотите , чтобы проверить пробелы между ^& #, так что- то более , как это: /ipsum/{/^[[:space:]]*#/s/#[[:space:]]*//}. Хотя даже в этом случае, в зависимости от того, где он #находится, он все равно может вызывать проблемы (например, в языках, которые используют отступ / разделение пробелов).
Джереми Дэвис

7
$ cat input.txt
# lorem ipsum blah variable
# lorem ipsum blat variable
# lorem ipsum blow variable
# lorem ipsum blip variable
# lorem ipsum blue variable

тогда:

$ sed 's|# \(.*blue.*\)|\1|' input.txt

дает:

# lorem ipsum blah variable
# lorem ipsum blat variable
# lorem ipsum blow variable
# lorem ipsum blip variable
lorem ipsum blue variable

Это работает следующим образом:

sГоворит , sedчто он должен заменить то , что регулярное выражение находит.

Шаблон, # \(.*blue.*\)который разбивается на: Найти хеш с пробелом. Скобка ( \() начинает группировку. .*blue.*это слово blueс чем-либо до и после. Следующая скобка ( \)) закрывает группировку.

Замена - \1это обратная ссылка на содержимое первой группирующей скобки.


3

Вы можете использовать Vim в режиме Ex:

ex -sc '/ipsum/s/#//|x' file
  1. s замена

  2. x сохранить и закрыть


Это круто. Я не знал об этом! Т.Б.Х., я не уверен, что это лучший ответ на этот вопрос (IMO - главный ответ sed), но он все еще очень крут! Спасибо за публикацию.
Джереми Дэвис
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.