Избежать строки - PullRequest
       26

Избежать строки

5 голосов
/ 18 апреля 2009

Я пишу сценарий оболочки и хочу экранировать строку. Есть ли способ конвертировать это:

I'm happy.
You're sad.

до

I\'m happy.\nYou\'re sad.

Я почти уверен, что есть какая-то комбинация sed / awk, которая делает это ...

Спасибо

Ответы [ 5 ]

1 голос
/ 16 ноября 2015

Для этого вы можете использовать обычный Bash (см. http://tldp.org/LDP/abs/html/string-manipulation.html).

Что-то вроде:

#!/bin/bash
X="I'm happy.
You're sad."
echo "========== BEFORE =========="
echo "${X}"
echo "========== AFTER ==========="
X="${X//\'/\\\'}"
X="${X//$'\n'/\\n}"
echo "${X}"
echo "============================"

Будет выдавать:

========== BEFORE ==========
I'm happy. You're sad.
========== AFTER ===========
I\'m happy.\nYou\'re sad.
============================
0 голосов
/ 08 августа 2013

Вот мое решение с использованием awk:

$ awk '{$1=$1}1' FS=\' OFS="\\\'" ORS='\\n' <<< "I'm happy.
You're sad."

Это приводит к выводу

I\'m happy.\nYou\'re sad.\n

Пояснение:

Я установил Разделитель Поля (FS) на ' (экранируя его для shell как \') и Выход Разделитель Поля (OFS) на \' (завернутый в "..." для выхода из ' для shell и выхода из \ дважды, один раз для shell и второй раз для awk, как "\\\'"). Без дополнительных опций разделитель записей (RS) является символом новой строки, но я установил Output Разделитель записей (ORS) на \n (снова экранируя \ для awk как \\n).

Теперь единственное, что нужно сказать awk, - это пересчитать каждую запись (установив $1 в $1, ничего не меняется, но awk считает, что запись изменилась, фактически подставив FS по OFS и, таким образом, через каждые ' по \') и распечатайте каждую запись (это то, что делает шаблон 1: 1 верно для всех записей, и поскольку никаких действий не было дано, стандартное действие {print $0} выполняется), эффективно заменяя RS на ORS и, таким образом, каждый перевод строки \n.

0 голосов
/ 18 апреля 2009

Это работает для замены ' на \'.

echo "I'm happy. You're sad" | sed "s/'/\\\'/g"

Вы уверены, что хотите заменить пробел между "счастливыми"? а "Ты" с \n? \n - это новая строка, но в вашей исходной строке нет новой строки.

0 голосов
/ 18 апреля 2009

Я думаю, что это делает то, что вы после. Последовательность операций в команде sed весьма критична. Обратите внимание, что это также касается обратной косой черты (а также одинарных кавычек) в строке (моя подсказка PS1 Osiris JL:):

Osiris JL: cat zzz
xxx="I'm happy.
You're sad."
yyy=$(echo "$xxx" | sed 's/[\'\'']/\\&/g;s/$/\\n/;$s/\\n$//')
echo "$xxx"
echo $xxx
echo "$yyy"
echo $yyy
#eval echo $yyy
#eval echo "$yyy"
Osiris JL: sh zzz
I'm happy.
You're sad.
I'm happy. You're sad.
I\'m happy.\n
You\'re sad.
I\'m happy.\n You\'re sad.
Osiris JL: 
0 голосов
/ 18 апреля 2009

1001 * попробовать *

sed 's/\\ /\\n/g' | sed 's/\\'/\\\'/g'

Я, наверное, перепутал несколько \ здесь. Лучший способ - попробовать сами.

...