Удалить все, что не соответствует шаблону 'something.swf' в txt файле

Вы должны извлечь LibreOffice_5.1.2.2_Linux_x86-64_deb.tar.gz и установить любой пакет deb в Это.

например tar xvf LibreOffice_5.1.2.2_Linux_x86-64_deb.tar.gz && dpkg -i $ (find. -Name '* .deb')

1
13.06.2016, 04:51
3 ответа

Если ваш grep не поддерживает -o , вы можете использовать вместо него perl :

perl -lne "print for /'.*?\.swf'/g" < in.txt > out.txt

С sed :

sed -n "/\('[^']*\.swf'\)/{s//\n\1\n/;s/.*\n\(.*\n\)/\1/;P;D;}"

Это эквивалент:

awk '
  {
    while(match($0, '"/'[^']*\.swf'/"')) {
      print substr($0, RSTART, RLENGTH)
      $0 = substr($0, RSTART+RLENGTH)
    }
  }'

( D в sed зацикливается с удаленной первой строкой пространства шаблонов).

3
29.04.2021, 00:38

Вот подход awk :

$ awk "{for(i=1;i<=NF;i++){if(\$i~/'[^']*.swf'/){print \$i}}}" file
'lol.swf'
'33.swf'

И не-GNU grep. Просто замените все пробелы на новые строки и используйте обычный grep :

$ sed 's/ /\n/g' file | grep "'[^']*.swf'"
'lol.swf'
'33.swf'
2
29.04.2021, 00:38

Я бы просто использовал grep (здесь предполагается GNU grep):

grep -o "'[^']*\.swf'" input.txt > output.txt

Explanation

  • -o печатает только совпадающую часть, а не всю строку.
  • "'[^']*\.swf'" - это шаблон для поиска, заключенный в ", так что в нем могут быть ". Он соответствует начальному ', затем [^']*, то есть неопределенному количеству не' символов, затем .swf (N.B. вы должны экранировать . как \. , так как . имеет особое значение в регулярных выражениях.
  • input.txt - входной файл для чтения.
  • > output.txt перенаправит вывод в этот файл. Если вы удалите эту часть, вы сможете предварительно просмотреть вывод на экране.

Альтернатива

Если GNU grep не установлен, можно попробовать следующее (вдохновленное идеей замены от terdon).

tr -d '\n' <input.txt | tr "'" '\n' | head -n -1 | tail -n +2 | grep '.*\.swf$' > output.txt

Explanation

  • tr -d '\n' прочитает из input.txt, затем удалит все переносы строк (\n).
  • tr "'" '\n' преобразует все ' в переносы строк. Это означает, что каждая строка ранее была окружена '.
  • head -n -1 | tail -n +2. Однако, если исходный текстовый файл начинался с something.swf' или заканчивался 'something.swf, они были бы на своей собственной строке, несмотря на наличие только одного ', и были бы ошибочно обнаружены следующим grep. Если бы, однако, первая или последняя строка правильно содержала обе кавычки, на этом этапе был бы дополнительный перевод строки в начале или в конце. Следовательно, этот сегмент кода отделяет последнюю и первую строку, чтобы соответствовать только этому сценарию.
  • grep '\.swf$' будет искать строки, которые заканчиваются на .swf.
4
29.04.2021, 00:38

Теги

Похожие вопросы