Удалить строки с определенным шаблоном [закрыто]

Прежде всего, вы должны знать, что версия, в которой вы работаете (4.2.*.*), протестирована для версии 14.04 LTS, и я бы не рекомендовал вам перейти на следующую версию.

Даже если вы хотите для обновления вы также можете получить его с терминала, выполнив следующее:

Сначала добавьте это ppa ppa:libreoffice/ppa, введя терминал:
sudo add-apt-repository ppa:libreoffice/ppa
Затем введите
sudo apt-get update && apt-get dist-upgrade

хорошо идти:)

0
задан 27 October 2017 в 21:39

6 ответов

Из вашего вывода видно, что вы выполнили команду

$ ls -la ./folder1/folder2/

или что-то похожее вдоль строк, и ваш вопрос попросит разобрать вывод ls. Однако вы действительно не должны разбирать ls, потому что это плохая практика по нескольким причинам. Лучшим подходом было бы следующее:

$ ls ./folder1/folder2/{"",.}test*pdf

Расширение пути будет захватывать только файлы, начинающиеся с test и заканчивающиеся на pdf, и которые могут начинаться или не начинаться с точки. Ваши файлы, которые заканчиваются на lyWfRr и GftyJL, не будут отображаться таким образом.

Однако, если вы настаиваете на разборе этого вывода, используйте $ anchor в awk для фильтрации строк, которые заканчиваются только в .pdf

$ awk '/pdf$/' input.txt -rw-rw-r-- 1 user1 user1 10 Oct 27 10:08 ./folder1/folder2/test-file1-228783-cause1-XY-OP-0001.pdf -rw-rw-r-- 1 user1 user1 20 Oct 27 10:12 ./folder1/folder2/test-file2-228651-cause1-XY-OP-0001.pdf -rw-rw-r-- 1 user1 user1 20 Oct 27 10:08 ./folder1/folder2/test-file3-228706-cause1-XY-OP-0005.pdf -rw-rw-r-- 1 user1 user1 20 Oct 27 10:15 ./folder1/folder2/test-file4-228695-cause1-XY-OP-0005.pdf -rw-rw-r-- 1 user1 user1 20 Oct 27 10:15 ./folder1/folder2/test-file5-228675-cause1-XY-OP-0001.pdf

Для записи я не согласен с этим, рекомендую пользователям избегать ls разбора и делать что-то в Right WayTM

1
ответ дан 18 July 2018 в 04:25

Хотя текущие ответы действительны, они могут быть проблематичными, если вы приступите к работе с чрезвычайно большим количеством файлов (более 30k). В этом случае я предлагаю использовать find:

find ./folder1/folder2 -maxdepth 0 -type f -name ".test-file*-*-cause1-XY-OP-*.pdf.*" -delete

EDIT: Я предполагаю, что вы хотите удалить файлы и не обновлять содержимое файла. В этом случае единственным вариантом является sed, awk или grep, поэтому вы должны избегать этого ответа.

0
ответ дан 18 July 2018 в 04:25

Я предполагаю, что этот текст хранится в файле, скажем ls_l_out.txt.

Я не знаю, как вы хотите, чтобы соответствие шаблонов было выполнено, но самое простое, что я вижу, - это сопоставить Разрешения.

Итак, имея это в виду, вы можете использовать эту команду sed:

$ sed '/^-rw-------/d' ls_l_out.txt -rw-rw-r-- 1 user1 user1 10 Oct 27 10:08 ./folder1/folder2/test-file1-228783-cause1-XY-OP-0001.pdf -rw-rw-r-- 1 user1 user1 20 Oct 27 10:12 ./folder1/folder2/test-file2-228651-cause1-XY-OP-0001.pdf -rw-rw-r-- 1 user1 user1 20 Oct 27 10:08 ./folder1/folder2/test-file3-228706-cause1-XY-OP-0005.pdf -rw-rw-r-- 1 user1 user1 20 Oct 27 10:15 ./folder1/folder2/test-file4-228695-cause1-XY-OP-0005.pdf -rw-rw-r-- 1 user1 user1 20 Oct 27 10:15 ./folder1/folder2/test-file5-228675-cause1-XY-OP-0001.pdf

Если вы запустите это, и вывод выглядит хорошо, вы можете затем отредактировать файл в -place с флагом -i в sed:

$ sed -i '/^-rw-------/d' ls_l_out.txt
1
ответ дан 18 July 2018 в 04:25

Из вашего вывода видно, что вы выполнили команду

$ ls -la ./folder1/folder2/

или что-то похожее вдоль строк, и ваш вопрос попросит разобрать вывод ls. Однако вы действительно не должны разбирать ls, потому что это плохая практика по нескольким причинам. Лучшим подходом было бы следующее:

$ ls ./folder1/folder2/{"",.}test*pdf

Расширение пути будет захватывать только файлы, начинающиеся с test и заканчивающиеся на pdf, и которые могут начинаться или не начинаться с точки. Ваши файлы, которые заканчиваются на lyWfRr и GftyJL, не будут отображаться таким образом.

Однако, если вы настаиваете на разборе этого вывода, используйте $ anchor в awk для фильтрации строк, которые заканчиваются только в .pdf

$ awk '/pdf$/' input.txt -rw-rw-r-- 1 user1 user1 10 Oct 27 10:08 ./folder1/folder2/test-file1-228783-cause1-XY-OP-0001.pdf -rw-rw-r-- 1 user1 user1 20 Oct 27 10:12 ./folder1/folder2/test-file2-228651-cause1-XY-OP-0001.pdf -rw-rw-r-- 1 user1 user1 20 Oct 27 10:08 ./folder1/folder2/test-file3-228706-cause1-XY-OP-0005.pdf -rw-rw-r-- 1 user1 user1 20 Oct 27 10:15 ./folder1/folder2/test-file4-228695-cause1-XY-OP-0005.pdf -rw-rw-r-- 1 user1 user1 20 Oct 27 10:15 ./folder1/folder2/test-file5-228675-cause1-XY-OP-0001.pdf

Для записи я не согласен с этим, рекомендую пользователям избегать ls разбора и делать что-то в Right WayTM

1
ответ дан 24 July 2018 в 18:04

Хотя текущие ответы действительны, они могут быть проблематичными, если вы приступите к работе с чрезвычайно большим количеством файлов (более 30k). В этом случае я предлагаю использовать find:

find ./folder1/folder2 -maxdepth 0 -type f -name ".test-file*-*-cause1-XY-OP-*.pdf.*" -delete

EDIT: Я предполагаю, что вы хотите удалить файлы и не обновлять содержимое файла. В этом случае единственным вариантом является sed, awk или grep, поэтому вы должны избегать этого ответа.

0
ответ дан 24 July 2018 в 18:04
  • 1
    Обратите внимание, что непонятно из вопроса, хочет ли OP удалить эти файлы или отфильтровать их из вывода ls -l, поэтому стоит упомянуть, что параметр -delete, который у вас есть в конце команды, будет иметь последствия , – Sergiy Kolodyazhnyy 27 October 2017 в 22:31
  • 2
    Хороший момент, я думаю, что OP хочет обновить содержимое файла, а не удалить кучу файлов. – Ste 'tbx' 28 October 2017 в 18:42

Я предполагаю, что этот текст хранится в файле, скажем ls_l_out.txt.

Я не знаю, как вы хотите, чтобы соответствие шаблонов было выполнено, но самое простое, что я вижу, - это сопоставить Разрешения.

Итак, имея это в виду, вы можете использовать эту команду sed:

$ sed '/^-rw-------/d' ls_l_out.txt -rw-rw-r-- 1 user1 user1 10 Oct 27 10:08 ./folder1/folder2/test-file1-228783-cause1-XY-OP-0001.pdf -rw-rw-r-- 1 user1 user1 20 Oct 27 10:12 ./folder1/folder2/test-file2-228651-cause1-XY-OP-0001.pdf -rw-rw-r-- 1 user1 user1 20 Oct 27 10:08 ./folder1/folder2/test-file3-228706-cause1-XY-OP-0005.pdf -rw-rw-r-- 1 user1 user1 20 Oct 27 10:15 ./folder1/folder2/test-file4-228695-cause1-XY-OP-0005.pdf -rw-rw-r-- 1 user1 user1 20 Oct 27 10:15 ./folder1/folder2/test-file5-228675-cause1-XY-OP-0001.pdf

Если вы запустите это, и вывод выглядит хорошо, вы можете затем отредактировать файл в -place с флагом -i в sed:

$ sed -i '/^-rw-------/d' ls_l_out.txt
1
ответ дан 24 July 2018 в 18:04
  • 1
    Что будет делать. Отлично!!! Шаблоны, которые я нашел в имени файла. (Точка) перед именем файла и 6 символами в конце имени файла. Просмотр некоторого регулярного выражения для соответствия этому шаблону. В любом случае, спасибо вам большое за помощь. – mr au 27 October 2017 в 22:51
  • 2
    @mrau В этом случае вы можете сопоставить только строки, которые заканчиваются на .pdf следующим образом: sed -n '/\.pdf$/p' или удалить строки, заканчивающиеся на .pdf., а затем шесть символов: sed '/\.pdf\..\{6\}$/d' – wjandrea 2 November 2017 в 03:37

Другие вопросы по тегам:

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