Найти текст в файлах и копировать на CSV

Решение

С помощью dos2unix решена проблема.

$ dos2unix patterns.txt
dos2unix: converting file /home/miguel/patterns.txt to Unix format ...
$ file patterns.txt
/home/miguel/patterns.txt: ASCII text

И теперь grep -f снова работает.

$ echo 'sandbox/test/script.py' | grep -G -f patterns.txt
sandbox/test/script.py
-121--166007-

Однако невозможно прокомментировать другой способ выражения

echo "foobarbaz" | tee file1 file2 file3 file4 file5 file6 file7 file8 > /dev/null

К этому можно было бы упростить, имея дело со многими файлами.

echo "foobarbaz" | tee file{1..8} > /dev/null
-121--8670-

Вот что вы должны сделать:

#!/bin/bash
synclient TouchpadOff=$(synclient -l | grep -c 'TouchpadOff.*=.*0')

Сохраните, что /usr/local/bin/touchpad.sh , chmod его для выполнения ( chmod 770/usr/local/bin/touchpad.sh должно быть достаточно? слишком много?). Так как мы поместили его в корзину, он должен быть частью вашего PATH, если это не нужно, чтобы добавить его. Затем мы просто делаем сочетание клавиш как Fn + F5 и заставляем его называть этот сценарий.

0
23.11.2018, 16:33
3 ответа

Не знаю, зачем вы добавили все эти прибамбасы. Это простое регулярное выражение сработало для меня:

grep "<div\sclass='cls\s'>.*<\/div>" file
<div class='cls '>text to be copied including some<span>and <p></p></span>and more text</div>
2
28.01.2020, 02:16
grep -r "/(?:\<div\sclass\=\'cls\s\'\>)(.*)(?=\<\/div\>)/" *.html > output.txt

Работает рекурсивно, но не интерпретирует регулярное выражение. Попробуйте вместо этого использовать fgrep или grep -f -r. Также вы можете touch output.txtиспользовать >> вместо >.

1
28.01.2020, 02:16

У вас шесть проблем:

  1. Вы включаете /в начале и в конце вашего регулярного выражения. Вы вводите /regex/в sed, vi, и другие программы для поиска, но для grepэто не нужно. И, на самом деле, grepбудет просто включать буквальные /символы в шаблон.
  2. Чтобы использовать PCRE в (простом )grep, вы должны использовать -P.
  3. Нет такой вещи, как -regexp; это должно быть --regexp. Или оставьте —regexp=и просто введите регулярное выражение в качестве простого аргумента, как вы делаете в grep.

После того, как я исправил вышеуказанные ошибки, обе команды(grep -Pиpcregrep)sort -обработанных — но они напечатали всю строку, содержащую шаблон, включая любой текст до <div …>или после </div>.

  1. Чтобы напечатать только текст, соответствующий шаблону, необходимо указать -o.

Даже после того, как я это исправил, я получил <div …>в выводе (, но не текст перед <div …>, или </div>или что-то после него ). Итак,

  1. Что-то не так с твоим взглядом -позади группы — это включается в матч.

    К сожалению, я недостаточно хорошо разбираюсь в PCRE. точно в чем проблема или как ее исправить. К счастью, я достаточно знаю о pcregrep, чтобы знать работу -. Если у вас есть несколько групп захвата в регулярном выражении, pcregrepпозволяет вам выбрать, какой из (s )вы хотите записать в вывод. Так,мы можем заставить его работать в pcregrepпревратив взгляд -сзади в группу захвата, а затем игнорируя его:

    pcregrep -o2 -r "(\<div\sclass\=\'cls\s\'\>)(.*)(?=\<\/div\>)"

    Но даже это сложнее, чем должно быть. Первая группа(<div …>)не обязательно должна быть группой захвата; т. е. это вообще не обязательно должна быть группа. Аналогично, последняя группа (</div>смотреть -вперед группа )не обязательно должна быть группа. Единственное, что должно быть группой, — это та часть, которую вы хотите запечатлеть — часть между <div …>и</div>:

    pcregrep -o1 -r "\<div\sclass\=\'cls\s\'\>(.*)\<\/div\>"

    Обратите внимание, что я изменил -o2на -o1, потому что теперь есть только одна группа.

    Кстати, как RudiC обнаружил (, но не упомянул ), почти ни одна из этих обратных косых черт не нужна. AFAICT, вам нужны только те, что в строках \s; поэтому мы можем упростить вышеизложенное до:

    pcregrep -o1 -r "<div\sclass='cls\s'>(.*)</div>"

    Теперь, когда мы удалили все PCRE -части регулярного выражения (смотреть -вперед и смотреть -назад ), вы можете подумать, что мы можем использовать это регулярное выражение с простым grep. К сожалению, мы не можем; указанная выше команда зависит от опции -oN, которого grepнет.

    Однако мы можем использовать его с sed!

    sed -n -r "s|.*<div\sclass='cls\s'>(.*)</div>.*|\1|p"

    Как и команда pcregrep, выполняется поиск всего регулярного выражения. (включая элементы до <div …>или после </div>, потому что я добавил .*в начале и в конце )и заменяет его #1 группой захвата (единственной ). pв конце заставляет печатать совпадающие строки; опция -nзаставляет не печатать строки, которые не совпадают.

    В приведенном выше примере используется |в качестве разделителя регулярного выражения, поскольку регулярное выражение содержит /. Если вы хотите использовать /в качестве разделителя, тогда вам нужно избежать текстового/</div>):

    sed -n -r "s/.*<div\sclass='cls\s'>(.*)<\/div>.*/\1/p"

    К сожалению,sedне имеет возможности рекурсивного поиска. Опция -rдля sedаналогична опции -Eдля grep; он определяет использование расширенных регулярных выражений (ERE ). Без него нам пришлось бы использовать \(и \)для группы захвата :

    .
    sed -n    "s/.*<div\sclass='cls\s'>\(.*\)<\/div>.*/\1/p"

    Конечно, вы можете выполнить рекурсивный поиск, запустив от sedдо find.

    П.С. Если у вас есть несколько пар <div …></div>на одной линии, эти команды sedбудут печатать только первый.

  2. Вы неправильно выполняете рекурсивный (поиск по дереву каталогов ).

    grep -r regex *.html

    pcregrepодин и тот же )выглядит в каждом .htmlфайле, а затем просматривает каждый файл в любомкаталог, имя которого заканчивается на .html. Значит, в (вряд ли? )событие что у вас есть подкаталог с именем foo.html, тогда приведенная выше команда будет искать каждый файл в этом каталоге. (даже если он называется MakefileилиREADME.txt). Если (, как я предполагаю, более вероятно ), у вас есть подкаталоги с такими именами, как page42и index, их не будут искать.

    То, что вы хотите сделать, это:

    grep -r --include='*.html' regex.

    который выполняет рекурсивный поиск во всех каталогах начиная с.(текущий каталог ), просмотр только файлов, имена которых соответствуют *.html.

2
28.01.2020, 02:16

Теги

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