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 - чудове доповнення! Вашому другому птаху (провідний простір), а як щодо: sed -i '/ipsum/s/^#[[:space:]]*//'?! ( ^означає початок рядка, $для кінця рядка) - принаймні, у гну сед ...
Джеремі Девіс

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 зберегти і закрити


Це досить круто. Я про це не знав! ТБХ, я не впевнений, що це найкраща відповідь на це питання (провідний відповідь ІМО - це одна), але це все ще дуже круто! Дякуємо за публікацію
Джеремі Девіс
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.