Как заменить кавычки в файле на sed?

10

У меня есть файл, который содержит несколько строк XML. Я хотел бы заменить определенные части файла. Некоторые части файла содержат кавычки ( "), которые я хотел бы заменить. Я пытался избежать кавычки \, но я не думаю, что это работает на основе результатов моего файла.

Вот пример одной из моих команд sed:

sed -e "s/\"text\"/'text'/ig" file.xml > temp.tmp

Это то, как вы избегаете кавычек в команде sed или я делаю что-то не так?

jbranchaud
источник
2
Ваша команда выглядит правильно для замены "text"на 'text'. Конечно, это ничего не даст "othertext". Покажите несколько строк ввода, соответствующий нежелательный вывод, и объясните, какой вывод вы хотите вместо этого.
Жиль "ТАК - перестань быть злым"
Итак, \"правильный ли способ избежать кавычек в команде sed?
jbranchaud
4
Не для sed: sed не нуждается или не поддерживает, убегая ". Но ваша команда оболочки использует строку в двойных кавычках, и \"там все правильно. sedПрограмма видит в s/"text"/'text'/igкачестве аргумента -e.
Жиль "ТАК - перестань быть злым"
@ Жиль А как насчет пространства? Сед понимает и уважает пробелы? Например, если моя команда содержала s/\"text\" /'text'/igбы, он нашел бы только "text" с пробелом после этого?
jbranchaud
3
Пробелы должны точно совпадать. Вместо того, чтобы продолжать этот диалог, я рекомендую опубликовать пример ввода и соответствующий желаемый результат (и, возможно, объяснить, почему вам нужно изменить цитату). Даже не ясно, что sedэто правильный инструмент для работы, может быть, вам нужен анализатор XML.
Жиль "ТАК - перестань быть злым"

Ответы:

11

Два совета:

  1. Вы не можете избежать одиночной кавычки в строке, заключенной в одинарные кавычки. Таким образом, вы должны закрыть цитату, добавить экранированную цитату, а затем снова открыть цитаты. То есть 'foo'\''bar', который разбивается как:

    • 'foo'        цитируемый foo
    • \'             спасся '
    • 'bar'        цитируемый bar

    уступая foo'bar.

  2. (необязательно) Вам не обязательно использовать /в sed. Я считаю, что использование /и \в том же выражении sed затрудняет чтение.

Например, чтобы удалить цитаты из этого файла:

$ cat /tmp/f
aaa"bbb"'ccc'aaa

Учитывая мои два совета выше, команда, которую вы можете использовать для удаления как двойных, так и одинарных кавычек:

$ sed -e 's|["'\'']||g'  /tmp/f

Основываясь на моем первом совете, оболочка уменьшает второй аргумент sed (то есть строку после -e) s|["']||gи передает эту строку в sed. Исходя из моего второго совета, sed относится к этому так же, как s/['"]//g. Это значит

удалить все символы, соответствующие либо 'или "   (т.е. заменить их ничем)

Возможно, вам нужно что-то более сложное, чем это, чтобы делать то, что вы хотите, но это только начало.

Ив Жункейра
источник
1
Чтобы уточнить второй совет: вы можете использовать любой символ вместо / при использовании команд s и y, возможно, среди других. При использовании регулярных выражений с другими командами sed первый разделитель (если используется альтернатива /) должен быть экранирован. Ваш предпочтительный разделитель также должен быть экранирован, если вы пытаетесь сопоставить его с регулярным выражением.
Эли Хедри
Трудно смешивать одинарные и двойные кавычки, не запутавшись. Некоторым людям легче читать, если вы цитируете одинарные кавычки, помещая их в двойные кавычки, а не избегая их. Таким образом, вместо 'foo'\''bar', мы могли бы использовать 'foo'"'"'bar'.
Скотт
1

У меня есть порт Windows с утилитами Unix, поэтому команды выглядят немного иначе, но у меня был CSV-файл с запятыми и кавычками. Используя эту ветку в качестве руководства, я смог удалить цитаты с помощью этой команды:

c:\Temp> cat report.csv | sed "s/\,/\ /g" | sed "s/[""]//g"
JaimeR744
источник
Спасибо! застрял на этом!
sendbits