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 ответа:
Вам нужно повторить подстановку несколько раз, чтобы удалить все неалфавитно-цифровые символы. Выполнение такого цикла в 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"
Демонстрация Регулярных Выражений