Як замінити лапки у файлі на 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.