Проверьте в командной строке, если слово отсутствует, если слово существует в нескольких файлах - PullRequest
1 голос
/ 05 марта 2019

Как получить список, который сообщает мне, когда слово (SecondWord в моем примере) отсутствует, когда записано другое слово (пример FirstWord в ма).

File1.txt:

Hello FirstWord ... SecondWord

...

... FirstWord ...

FirstWord ... SecondWord

FirstWord ... ...

Hello ... SecondWord

File2.txt:

Hello FirstWord ... SecondWord

FirstWord ...

Мне нужен файл в конце со строкой и именем файла:

3: File1

5: File1

2: File2

Я думаю, что я пытаюсь сделать это излишним: /

   filename='test.txt'
lineArray[0]=0
filesAwaitable[0]=$lineArray
grep -r -n 'FirstWord ' Sources/ --include=\*.txt | awk -F: '{print $2":"$1}' > $filename
while read line; 
    do 
        IFS=:
        ary=($line)
        for key in "${!ary[@]}";
            do
                if [[ $filesAwaitable["$key"] != *"${ary[$key]}"* ]]; then
                    filesAwaitable["$key"] = "${ary[$key]}"
                    echo "${ary[$key]}";
                fi

                #grep -n -r 'SecondWord' line | awk -F: '{print $2":"$1}'

            done
    done < $filename

Спасибо за вашу помощь

Ответы [ 3 ]

0 голосов
/ 08 марта 2019

В случае, если с Perl-решением все в порядке, вот простое с тем же регулярным выражением, что и для GNU grep:

perl -ne 'print "$. : $ARGV\n" if /FirstWord((?!SecondWord).)*$/; close ARGV if eof' File?.txt

Как я могу использовать эту команду во всех источниках / папках длявсе файлы .txt?

Для этого вы можете использовать find:

find Source -name \*.txt|xargs perl …

(без File?.txt в конце команды perl).

0 голосов
/ 11 марта 2019

Если оболочка имеет значение bash, проблему легко решить с помощью расширенного сопоставления с шаблоном , оператор !(<i>pattern</i>), который соответствует чему угодно, кроме указанного шаблона :

shopt -s extglob    # enable extended pattern matching features
for file in "$@"
do  lineno=0
    while read line
    do  ((++lineno))
        case "$line" in *FirstWord!(*SecondWord))   echo $lineno : $file
        esac
    done <$file
done
0 голосов
/ 07 марта 2019

В моем примере я хочу знать, когда SecondWord отсутствует, когда FirstWord был написан ранее.

Если у вас есть grep, который понимает регулярные выражения perl, вы можете напрямую указатьшаблон для FirstWord, за которым не следует SecondWord до конца строки :

grep -nP 'FirstWord((?!SecondWord).)*$' File?.txt

Это приводит к приведенным примерам:

File1.txt:3:... FirstWord ...
File1.txt:5:FirstWord ... ...
File2.txt:2:FirstWord ...

Чтобы переставить это вжелаемый формат вывода, вы можете передать его через

awk -F: '{print $2,":",$1}'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...