В зависимости от Вашего распределения можно загрузить -doc
пакеты (т.е. можно установить xrdb-doc
)
Упрощенный ответ может быть:
sed 's/#[^#]*$//g'
, который будет соответствовать #
, за которым следует один или несколько «не #
символ до конца строки Отказ Если вы после чего-то более сложнее, это стоило бы немного расширяться в частности, что вы после.
С 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
.