Як замінити лапки у файлі на sed?


11

У мене є файл, який містить кілька рядків xml. Я хотів би замінити певні частини файлу. Деякі частини файлу містять лапки ( "), які я хотів би замінити. Я намагаюся уникнути лапки \, але не думаю, що це працює на основі результату мого файлу.

Ось приклад однієї з моїх команд sed:

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

Це те, як ви уникаєте лапок у команді sed чи я щось роблю не так?


2
Ваша команда виглядає правильно для заміни "text"на 'text'. Звичайно, це нічого не зробить "othertext". Покажіть кілька рядків введення, відповідний небажаний вихід і поясніть, який вихід ви хочете замість цього.
Жил "ТАК - перестань бути злим"

Тож \"правильний спосіб уникнути лапок у команді sed?
jbranchaud

4
Не для sed: sed не потребує або підтримка, втеча ". Але ваша команда оболонки використовує рядок з подвійним цитуванням і \"там правильна. sedПрограма бачить в s/"text"/'text'/igякості аргументу -e.
Жил "ТАК - перестань бути злим"

@Gilles Що з пробілами? Чи sed розуміє та поважає білі простори? Наприклад, якщо моя команда містила, s/\"text\" /'text'/igчи знайде вона лише "text" пробіл після неї?
jbranchaud

3
Пробіли повинні точно збігатися. Замість того, щоб продовжувати цей діалог, я рекомендую розмістити деякий зразок введення та відповідний бажаний вихід (і, можливо, пояснити, чому потрібно змінити цитування). Навіть не ясно, що sedце правильний інструмент для роботи, можливо, ви хочете аналізатор XML.
Жил "ТАК - перестань бути злим"

Відповіді:


12

Дві поради:

  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"

Дякую! застряг на цьому!
sendbits
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.