2013-05-02 7 views
3

Учитывая этот файлс трубой экранирования в

$ cat foo.txt 
\"That's funny, haha\" 

Я могу экранирования в двойные кавычки с read

$ read bar < foo.txt 

$ echo $bar 
"That's funny, haha" 

Однако это может быть сделано с трубой? Что-то вроде

cat foo.txt | unescape 

ответ

6

Это, кажется, сделать это

sed -r 's/\\(.)/\1/g' 
+3

В Mac OS X это '-E' вместо' -r' – max

+3

Это будет работать только для экранированных символов ascii, таких как пробел, обратная косая черта и т. Д. Если это ускользнет от новой строки, табуляции или значения unicode, это не сработает – EkriirkE

2

Да или нет, в зависимости от того, что вы подразумеваете под своим вопросом. Труба не может удалить обратный слеш, но, как вы видели, read может:

cat foo.txt | read bar 

Это, однако, бесполезное использование cat И это не будет делать то, что вам нужно в любом случае.

В Bash у этого есть добавленная «функция», в которой каждая сторона трубы работает в собственном процессе. Это означает, что переменная (bar) не будет доступна в вызывающем процессе. Таким образом, обратная косая черта будет удалена, но она не принесет вам ничего хорошего.

Да, вы могли изловчиться, чтобы захватить его:

bar=$(cat foo.txt | { read bat;echo $bat;}) 

Но это не просто страшно смотреть, это неэффективно, а также.

Придерживайтесь перенаправления.

0

Это старый вопрос, но я добавлю этот ответ так, что он здесь для записи, так как у меня был тот же вопрос и не мог найти решение в любом месте. Я придумал это решение, которое работает для любой строки управляющих последовательностями:

echo "" | gawk "{ print \"\`cat foo.txt\`\" }" 

echo "" | gawk "{ print \"$(cat foo.txt)\" }" 

echo "" | gawk "{ print \"$(< foo.txt)\" }" 

Они все варианты одной и ту же операции, и обратите внимание на использование обратных кавычек в первом. Они используют unescaping, выполненный командой печати gawk, и ограничены однострочным входным файлом (хотя я уверен, что для многострочного ввода может быть разработан более сложный вариант).

Отметьте, что cat foo.txt | gawk '{ printf $0 }', который, как я думал, может быть решением, не работает - кажется, что gawk не отменяет его вход, даже если это используется как строка формата printf, которая в противном случае была бы unescape.

Смежные вопросы