Разделите комментарии #xxx кроме тех случаев, когда они происходят в кавычках в sed

В зависимости от Вашего распределения можно загрузить -doc пакеты (т.е. можно установить xrdb-doc)

2
16.03.2015, 12:19
2 ответа

Упрощенный ответ может быть:

sed 's/#[^#]*$//g'

, который будет соответствовать # , за которым следует один или несколько «не # символ до конца строки Отказ Если вы после чего-то более сложнее, это стоило бы немного расширяться в частности, что вы после.

1
27.01.2020, 22:05

С GNU или FreeBSD sed:

$ sed -E 's/^(([^"#]|"(\\.|[^\\"])*")*)#.*/\1/' << EOF
heredoc> hi this is "#test" #this is comment
heredoc> this is test # comment with # characters
heredoc> hi this is "\"test" #this is comment as " was escaped earlier
heredoc> EOF
hi this is "#test"
this is test
hi this is "\"test"

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

  • символов, отличных от " или # ([^"#"])
  • или "..." цитирует строку, где ..... является последовательностью обоих:
    • \x: обратный слеш, за которым следует любой символ ( \\. )
    • или символ, отличный от " или \.

POSIXly (если отсутствует оператор alternation ( |) (yet)) можно написать:

sed 's/^\(\(\("\(\(\\.\)\{0,1\}[^\"]\)*"\)\{0,1\}[^"#]\)*\)#.*/\1/'

Там вместо ERE (a|b)* мы используем BRE \(a\{0,1\}b\)*, т.е. вместо последовательности a или b, мы используем последовательность b, которой опционально предшествует a.

2
27.01.2020, 22:05

Теги

Похожие вопросы