2017-01-05 4 views
-2

У меня есть файл с зависимостями. Некоторые из зависимостей прокомментированы (#). Я хочу раскомментировать строку, если она содержит подстроку cassandra. Так что если файл выглядит следующим образом:Bash: Удалить # из начала строки, если строка содержит указанную подстроку

firstdependency>=2.0.7 # comment 
otherdependency>=0.8.9 # another comment 
#commenteddependency 
#cassandra-driver>=2.1.4,!=3.6.0 # Apache-2.0 
anotherdependency!=0.18.3,>=0.18.2 

Я хочу, чтобы сценарий, который изменит только четвертую строчку в

cassandra-driver>=2.1.4,!=3.6.0 # Apache-2.0 

Так что следует проверить, если строка содержит подстроку cassandra, и если да, то проверьте, первый символ этой строки равен #, а если да - удалите первый символ этой конкретной строки - DONE. Я не знаю, как это сделать. Помогите!

ответ

2

Ну, вы знаете, что начинаются с sed, тогда это всего лишь вопрос правой команды замены.

sed -e "s/^#\(.*cassandra.*\)$/\1/" 

находит линии придерживаясь следующих правил:

  1. начиная с #,
  2. , содержащего "Кассандры" где-то (произвольные последовательности символов разрешены как до, так и после),

хранит всю остальную часть линии (кроме #) во временном \1 (это то, что \( ... \) do), и ему предлагается заменить такую ​​линию только на последнюю.

При необходимости это может быть дополнительно улучшено до, например, не искать «cassandra» после второго появления #, но я полагаю, что комментарии в конце строки в вашем примере добавляются вами и не будут проблемой.

Пример вывода:

firstdependency>=2.0.7 # comment 
otherdependency>=0.8.9 # another comment 
#commenteddependency 
cassandra-driver>=2.1.4,!=3.6.0 # Apache-2.0 
anotherdependency!=0.18.3,>=0.18.2 
+1

@fedorqui Спасибо, я заметил это и просто отправил редактирование, когда пришел ваш комментарий :-) –

+0

молодцы! Вы также можете просто сказать '^ # \ /.* cassandra \)'.Захват всего остального не требуется, так как он будет напечатан в любом случае. Фактически, теперь я вижу, что это то, что сделал gniourf^2! – fedorqui

0

Ваш скрипт должен содержать это только строку:

sed -e 's/#cassandra/cassandra/' your_file 

регулярное выражение сек /// заменяет один шаблон другим, в данном случае «#cassandra» на "Кассандре"

+1

Exact, извините. Ответ TheVee намного лучше. – Felandral

1

Simple с ed. , стандартный редактор:

printf '%s\n' 'g/^#.*cassandra/s/^#/' w | ed -s file >/dev/null 

команда g/^#.*cassandra/ отмечает все строки, которые начинаются с # и содержат строку cassandra и s/^#/ удаляет ведущие # в этих отмеченных строках.

1

В AWK. Если запись начинается с # и имеет cassandra на него, удалить ведущие # печать все записи:

$ awk '/^#/ && /cassandra/ { sub(/^#/,"") } 1' file 
firstdependency>=2.0.7 # comment 
otherdependency>=0.8.9 # another comment 
#commenteddependency 
cassandra-driver>=2.1.4,!=3.6.0 # Apache-2.0 
anotherdependency!=0.18.3,>=0.18.2 
Смежные вопросы