Как сопоставить строку, начинающуюся со специального символа, с помощью grep?

Я думаю, что вы пытаетесь скопировать только последнюю версию.

#!/bin/bash
oldlocation="/file_path/"
newlocation="/new_path/"

cd "$oldlocation"

#Get the last version
file="$(ls  *SNAPSHOT.txt | sort -V | tail -n1)"

cp -v "$file" "$newlocation" 
echo "Everything is ok"
0
22.08.2017, 03:29
4 ответа

Возьмем этот образец файла:

$ cat file.txt
        =putSomething here;

Теперь, чтобы найти все такие .txtфайлы в текущем каталоге:

$ grep -n '^[[:space:]]*=' *.txt
file.txt:1:        =putSomething here;

Если вы хотите найти все такие .txtфайлы в текущем каталоге и во всех его подкаталогах, затем используйте:

$ grep -rn '^[[:space:]]*=' --include '*.txt'
subdir/another.txt:1:        =putSomething here;
file.txt:1:        =putSomething here;

Примечания

  1. findи xargsздесь не нужны . С опцией -rgrepвыполняет рекурсивный поиск в подкаталогах.

  2. --include '*.txt'ограничивает grepфайлами, соответствующими glob *.txt.

  3. ^соответствует началу строки. [[:space:]]*соответствует нулю или более пробельным символам. =соответствует знаку равенства. В регулярных выражениях POSIX нет ничего особенного в = , поэтому его можно рассматривать как любой другой символ.

  4. Завершение регулярного выражения grep с помощью .*$не меняет совпадающие строки. .*$совпадает либо с любыми символами, либо без символов. Единственная причина использовать .*$— изменить то, что grep выделяет как совпадающий текст.

2
28.01.2020, 02:19

Строка, начинающаяся с =, преобразуется в регулярное выражение ^=.

Ваша команда поиска должна быть:

find. -name "*.txt" | xargs grep '^='

Или, лучше (избегать бесполезного использованияxargs):

find. -type f -name "*.txt" -exec grep '^[[:space:]]*=' {} +

(здесь из-за окончания +выполняется только один grep для кучи файлов)

2
28.01.2020, 02:19

Попробовал приведенную ниже команду, похоже, она работает.

grep -rn '^ *=' **/*txt
0
28.01.2020, 02:19

В качестве альтернативы рекурсивным grepиxargs:

$ find /dir -type f -name "*.txt" -exec grep -q '^[[:space:]]*=' {} ';' -print

Это будет искать в/dir(и ниже )все обычные файлы, имена которых соответствуют заданному шаблону. Для каждого такого файла, если grep -q '^[[:space:]]*='завершается с нулевым статусом выхода (шаблон совпал где-то в файле ), то выводится его имя.

Или, если вы просто хотите увидеть сами строки:

$ find /dir -type f -name "*.txt" -exec grep '^[[:space:]]*=' {} '+'

+в конце будет передавать как можно больше имен файлов при каждом вызове grep, тогда как использование ;, как в моем первом примере, будет передавать только один файл за раз.

0
28.01.2020, 02:19

Теги

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