Как удалить строки из файла, где в скобках меньше 5 и больше 10 символов в BASH?

У меня есть такой файл, содержащий пары ( и ) в каждой строке:

This is a sentence (1).
This is another sentence (a note).
This is a sentence (2).
This is another sentence (with another, longer note).

Мне нужно удалить все строки, в которых между ( и ) меньше 5 символов, и все строки, в которых между ( и ) больше 10 символов. Вывод приведенного выше примера будет выглядеть следующим образом:

This is another sentence (a note).
  • В строке никогда не бывает более одного набора скобок.
  • Наборы скобок никогда не разбиваются на строки.
  • Любой символ, включая пробелы, внутри круглых скобок может считаться символом.

Это то, что у меня есть до сих пор:

grep \([\w{5},\w{10}]\) file.txt

awk -F\( -F\) 'length($2)>5' 'length($2)<10' file.txt

Как я могу удалить любые строки из файла, в которых слишком мало или слишком много символов внутри круглых скобок?


person Village    schedule 22.02.2014    source источник
comment
Я не понимаю вывод вашего примера. Разве строки 1, 3 и 4 не должны быть удалены из вывода?   -  person Barmar    schedule 22.02.2014


Ответы (5)


Это сохранит все строки с 5-10 символами между скобками и удалит все остальные строки.

egrep '\(.{5,10}\)' file.txt
person Barmar    schedule 22.02.2014

Вы можете попробовать это sed,

sed '/(.\{10,\})\|(.\{,5\})/d' file.txt

sed -n '/(.\{5,10\})/p' file.txt

Тест:

sat:~# sed '/(.\{10,\})\|(.\{,5\})/d' file.txt
This is another sentence (a note).
person sat    schedule 22.02.2014

Вы можете использовать это

grep -P "\(.{5,10}\)" filename.txt

Если вы хотите установить результаты в переменную, вы можете использовать это.

var=$( grep -P "\(.{5,10}\)" filename.txt )

or

var=` grep -P "\(.{5,10}\)" filename.txt `

Обратите внимание, что во втором примере используются обратные кавычки, а не одинарные кавычки. И если вы хотите распечатать вывод в файл, вы можете использовать либо

grep -P "\(.{5,10}\)" filename.txt > newfile.txt

or

grep -P "\(.{5,10}\)" filename.txt >> newfile.txt

Где второй пример добавит существующий файл или создаст новый файл, если это необходимо.

вы также можете использовать egrep вместо grep (если вы это сделаете, вам не нужны параметры -P

Это делает использование поиска по регулярному выражению, поскольку файл и программы grep и egrep будут печатать каждую строку, соответствующую предоставленному регулярному выражению. В этом случае регулярное выражение имеет вид "\(.{5,10}\)". Обратная косая черта означает, что следующий символ является буквальным символом, поэтому, когда за ним следует ( или a ), вы говорите литерал '(', а не то, что он обычно представляет в регулярном выражении. ' .' означает любой символ, кроме символа новой строки, {} указывает на ограниченное количество повторений последнего символа (в данном случае это будет любой символ), а числа внутри - минимальное и максимальное, разделенные запятой.

Таким образом, мы в основном говорили, что grep распечатывает любую строку, содержащую строку, содержащую шаблон открывающей скобки, а затем от 5 до 10 символов, которые не являются новой строкой, за которой следует закрывающая скобка.

Дополнительную информацию о строке регулярного выражения можно получить здесь http://www.regular-expressions.info/.

person Linx    schedule 22.02.2014

Вы можете использовать авк. От пяти до десяти символов между скобками

awk  '/\(.{5,10}\)/'  filename.txt

или от пяти до десяти неправых скобок после левой скобки

awk  '/\([^)]{5,10}\)/'  filename.txt
person Fritz G. Mehner    schedule 22.02.2014

Вы не можете назначить два разделителя полей таким образом. Изменение решения awk:

awk -F"[()]" 'length($2)>5 && length($2)<10’ file.txt
person jaypal singh    schedule 22.02.2014