Может ли bash использовать непечатаемый символ в качестве кавычки?

Этот вопрос возникает из одного варианта использования, замените " на '', причуда латекса.

Я обычно использую ' (одинарная кавычка), чтобы заключить сценарий, если внутри есть " (двойная кавычка), и наоборот. Однако в этом случае в этом скрипте появляются как одинарные, так и двойные кавычки, и мне пришлось поискать в Google правильный способ справиться с этим. Этот один предлагает решение. Ниже приведено правильное, но не очень читаемое решение.

sed 's!"!'\'''\''!' {filename}

После того, как это заработало, я начал думать, что эта неловкость происходит из-за этой механики цитирования. Следовательно, можно ли использовать непечатаемый символ в качестве кавычки? Тогда нам больше не нужно избегать кавычек.


person Albert Netymk    schedule 07.07.2013    source источник
comment
для некоторого определения права: вам не хватает конечного разделителя для s!!!   -  person glenn jackman    schedule 08.07.2013
comment
@glennjackman Хороший улов. Фиксированный.   -  person Albert Netymk    schedule 10.07.2013
comment
Извините, я не понимаю, о чем вся эта суета. Что не так с sed "s/\"/''/g"? Это намного лучше, чем у вас, и очень естественно, когда вы понимаете, как работают двойные кавычки.   -  person gniourf_gniourf    schedule 11.07.2013
comment
@gniourf_gniourf Круто! Я даже не представлял, что это может быть так просто. Я испытаю это, когда я приду домой. Точно так же sed 's!"!\'\'!' тоже должен сработать, верно?   -  person Albert Netymk    schedule 12.07.2013
comment
@gniourf_gniourf Мое понимание было неверным. Мы не могли просто экранировать ', используя обратную косую черту внутри ''непосредственно. На первом уроке по программированию оболочки нам сказали, что строка внутри '' интерпретируется буквально.   -  person Albert Netymk    schedule 02.08.2013


Ответы (1)


В bash у вас есть одинарные и двойные кавычки, а также здесь документы и здесь строки: вы можете сделать:

sed_script=$(cat << 'END'
s/"/''/g
END
)
sed "$sed_script" filename
person glenn jackman    schedule 07.07.2013
comment
sed -f - filename <<'END' ... 'END' также будет работать (прочитайте скрипт непосредственно из стандартного ввода, вместо того, чтобы вставлять его в параметр оболочки). - person chepner; 08.07.2013
comment
@chepner Я не могу заставить его работать, используя ваше решение. sed -f - <filename> <<'END' s!"!''! 'END' - это то, что я использовал, и bash считает, что это бесконечные кавычки, запрашивает /, когда я нажимаю Enter. - person Albert Netymk; 27.07.2013
comment
Не цитируйте последнее END. Цитирование первого END придает ему магическую силу. - person glenn jackman; 27.07.2013
comment
С какой стати я процитировал заключительную END? - person chepner; 28.07.2013
comment
@glennjackman @chepner Кажется, у вас обоих все получается. Не повезло мне. sed -f - <filename> <<'END' s,",'', END по-прежнему не работает, оставляя меня с /, когда я нажимаю Enter. - person Albert Netymk; 02.08.2013