Как заменить одинарную кавычку (') на двойную кавычку (") в файле, используя скрипт / команды оболочки Unix? Апостроф не должен заменяться - PullRequest
0 голосов
/ 15 июня 2019

Я пытаюсь заменить только одинарные кавычки (') на двойные кавычки (") в файле в Unix, а не на апостроф ('). Апостроф (') должен оставаться как есть.

IПолучаю желаемый вывод с помощью 3 команд sed, выполненных последовательно. Однако я не могу обратиться к последней строке «поддельные новости».

sed -i 's/'\''/"/g' test.txt

sed -i 's/"s/'\''s/g' test.txt

sed -i 's/s"/s'\''/g' test.txt

1st sed - преобразует все одинарные кавычки в двойные кавычки.

2nd sed - конвертирует все двойные кавычки (за которыми следуют s) с одинарной кавычкой.

3rd sed - конвертирует все s, а затем двойные кавычки с одинарной кавычкой.

Входной файл-

Hello Sir!
How are you?
How's your health?
All 'good'?
Charles' here.
'fake news'

Ожидаемый результат-

Hello Sir!
How are you?
How's your health?
All "good"?
Charles' here.
"fake news"

Ответы [ 3 ]

1 голос
/ 15 июня 2019

Это делает то, что вы просите с помощью одной команды замены:

$ sed -E "s/'([^']*)'/\"\1\"/g" file
Hello Sir!
How are you?
How's your health?
All "good"?
Charles' here.
"fake news"

Вышеприведенное работает путем замены пар одинарных кавычек на пары двойных кавычек.

'([^']*)' соответствуетодинарная кавычка, за которой следуют любые символы, кроме одинарной кавычки, за которыми следует одинарная кавычка.Символы внутри одинарных кавычек сохраняются в группе захвата 1. Замена, \"\1\", берет группу захвата и помещает ее в двойные кавычки.

Хотя это обрабатывает запрошенные вами случаи, оноЛегко представить более сложные случаи, которые не могут быть обработаны без сложного лингвистического анализа.

Альтернативный стиль

Та же команда, что и выше, может быть записана в альтернативном (но эквивалентном) цитировании оболочкистиль:

sed -E 's/'\''([^'\'']*)'\''/"\1"/g' file
0 голосов
/ 15 июня 2019

Вы можете запустить все команды в одном вызове sed:

sed 's/'\''/"/g;s/"s/'\''s/g;s/s"/s'\''/g'

или

sed -e 's/'\''/"/g' -e 's/"s/'\''s/g' -e 's/s"/s'\''/g'
0 голосов
/ 15 июня 2019

Чтобы воспроизвести ваши три sed, вы можете использовать одно perl регулярное выражение:

perl -p -e 's/([^s])'\''([^s])/$1"$2/g' test.txt

редактировать: случай "поддельных новостей" :

Вы можете обработать половину дела «поддельные новости» с помощью:

perl -p -e 's/([^s]|^)'\''([^s])/$1"$2/g' test.txt

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

perl -p -e 's/([^\w][a-z]+)s'\''/$1s"/g' test.txt

В «одиночной» команде (с конвейером):

perl -p -e 's/([^s]|^)'\''([^s])/$1"$2/g' test.txt | perl -p -e 's/([^\w][a-z]+)s'\''/$1s"/g' 

, что дает:

Здравствуйте, сэр!

Как дела?

Как твое здоровье?

Все "хорошо"?

Чарльз здесь.

"поддельные новости"

"поддельные новости"

...