Как я могу использовать perl / awk / sed для поиска всех вхождений текста, заключенного в кавычки, в файле, а затем удалить их?

#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. Было бы неплохо объяснить ваше решение. Указание того, какой язык вы используете, также важно для читателей.