2015-01-26 4 views
3

Скажем, у меня есть строка, как это:СЭД: удалить все не алфавитно-цифровые символы внутри цитат только

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 команды, соответствующей строку и удаление внутри кавычек, но он удаляет все, что находится внутри Qu РИМЕЧАНИЯ включая кавычки:

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

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

+0

sed не подходит для этого. Как насчет Perl? Вы хотите решения perl? –

+0

Ну, я добавляю этот кусок кода в существующий скрипт, к которому я перейду другим пользователям ... #!/Bin/bash - это моя оболочка, поэтому я не думаю, что perl здесь полезен. –

ответ

2

Вы должны повторить подстановка несколько раз, чтобы удалить все не алфавитно-цифровые символы. При выполнении такого цикла в СЭД требует этикетки и использование команд в 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 намного проще.

+0

Это сработало отлично! Спасибо за геп! –

2

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" 

Regex Demo

 Смежные вопросы

  • Нет связанных вопросов^_^