Это делает то, что вы просите с помощью одной команды замены:
$ 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