#regex #perl #shell #sed #ksh
#регулярное выражение #perl #оболочке #sed #кш
Вопрос:
Как я могу использовать perl, awk или sed для поиска всех вхождений текста, заключенного в кавычки, в файле и распечатать результат удаления этих вхождений из файла? Я не хочу фактически изменять файл, а просто распечатываю результат изменения файла, как это делает sed.
Например, скажем, файл содержит следующее :
data|more data|"not important"|"more unimportant stuff"
Мне нужно его распечатать:
data|more data||
Но я хочу оставить файл нетронутым. Я пытался использовать sed, но не смог заставить его принимать регулярные выражения.
Я пробовал что-то вроде этого:
sed -e 's/<["] [^"]*["] >//g' file.txt
но он ничего не делает и печатает исходный файл.
Есть мысли?
Ответ №1:
Использование однострочного perl:
perl -pe 's/".*?"//g' file
Объяснение:
Переключатели:
-p
: Создаетwhile(<>){...; print}
цикл для каждой строки в вашем входном файле.-e
: Указываетperl
выполнить код в командной строке.
Ответ №2:
Кажется, у вас есть несколько дополнительных символов в вашей sed
команде.
sed -e 's/"[^"]*"//g' file.txt
Ввод:
"quoted text is here" but not quoted there
never more
"hello world" foo bar
data|more data|"not important"|"more unimportant stuff"
Вывод:
but not quoted there
never more
foo bar
data|more data||
Комментарии:
1. Как сказал Пьер в своем ответе, вам не нужно так много скобок.
Ответ №3:
echo 'data|more data|"not important"|"more unimportant stuff"' | sed -E 's/"[^"]*"//g'
Вам не нужно объявлять класс символов (скобки) только для одного символа…
Комментарии:
1. Однако я хочу, чтобы он также удалял строки в двойных или тройных кавычках.. Я должен был упомянуть об этом.
2. Тогда это не способ сделать это. Рассмотрим следующий пример: «Завтра я пойду в школу» … вы собираетесь удалить «я» и снова начать удалять материал со следующего »
3. Я могу гарантировать, что в файле нет одинарных кавычек. Есть только несколько вхождений двойных кавычек.
Ответ №4:
my $cnt=qq(data|more data|"not important"|"more unimportant stuff");
my @arr = $cnt =~ m{(?:^||)([^"][^|]*[^"])(?=||$)}ig;
print "@arr";
Этот код может вам помочь..
Комментарии:
1. Было бы неплохо объяснить ваше решение. Указание того, какой язык вы используете, также важно для читателей.