sed: удалить все не буквенно-цифровые символы только внутри цитат


Допустим, у меня есть такая строка:

Output:   
I have some-non-alphanumeric % characters remain here, I "also, have_+ some & .here"

Я хочу только удалить неалфавитные символы внутри цитат , кроме запятых, точек или пробелов :

Desired Output:    
I have some-non-alphanumeric % characters remain here, I "also, have some  .here"

Я попробовал следующую команду sed, сопоставляющую строку и удаляющую внутри кавычек, но она удаляет все, что находится внутри кавычек, включая кавычки:

sed '/characters/ s/("[^"]*)([^a-zA-Z0-9,. ])([^"]*")//g'

Любая помощь ценится, предпочтительно используя sed, чтобы получить желаемый результат. Заранее спасибо!

2 3

2 ответа:

Вам нужно повторить подстановку несколько раз, чтобы удалить все неалфавитно-цифровые символы. Выполнение такого цикла в sed требует метки и использования команд b и t:

sed '
# If the line contains /characters/, just to label repremove
/characters/ b repremove
# else, jump to end of script
b
# labels are introduced with colons
:repremove
# This s command says: find a quote mark and some stuff we do not want
# to remove, then some stuff we do want to remove, then the rest until
# a quote mark again. Replace it with the two things we did not want to
# remove
s/\("[a-zA-Z0-9,. ]*\)[^"a-zA-Z0-9,. ][^"a-zA-Z0-9,. ]*\([^"]*"\)/\1\2/
# The t command repeats the loop until we have gotten everything
t repremove
'

(это будет работать даже без [^"a-zA-Z0-9,. ]*, но это будет медленнее на строках, которые содержат много не буквенно-цифровых символов в строке)

Хотя другой ответ прав в том, что делать это в perl намного проще.

Sed не является подходящим инструментом для этого. Вот один через Perl.

perl -pe 's/[^a-zA-Z0-9,.\s"](?!(?:"[^"]*"|[^"])*$)//g' file

Пример:

$ echo 'I have some-non-alphanumeric % characters remain here, I "also, have_+ some & .here"' | perl -pe 's/[^a-zA-Z0-9,.\s"](?!(?:"[^"]*"|[^"])*$)//g'
I have some-non-alphanumeric % characters remain here, I "also, have some  .here"

Демонстрация Регулярных Выражений