Удалить много слов одной командой

Имеются два работающих терминала, один и тот же пользователь.

Сценарий запущен на одном терминале

Второй терминал должен контролировать, используя topили ps aux, и при необходимости завершать процесс с другого терминала.

4
10.09.2020, 15:10
4 ответа

Вы можете использовать синтаксис «ИЛИ» для регулярных выражений:

sed -E '/png|jpg|svg/d' url.txt

Это приведет к удалению всех строк, содержащих любой шаблон. Если вы хотите убедиться, что этот шаблон является расширением имени файла, т. е. что шаблон встречается в конце строки , вы можете включить якорь в регулярное выражение:

sed -E '/(png|jpg|svg)$/d' url.txt

Между прочим, вам никогда не нужно catфайл в sed; он может прочитать их все самостоятельно.

18
18.03.2021, 23:06

Вы также можете использовать Grep:

grep -vE '\.(svg|jpg|png)' file

-vпечатает только не совпадающие -строки, а -Eвключает расширенное регулярное выражение.

\.(svg|jpg|png)— регулярное выражение, соответствующее .svgили. jpgили .png.

Если вы хотите изменить файл,

  • Используйте Ed с глобальной командой:

    printf '%s\n' 'g/\.\(svg\|jpg\|png\)/d' w q | ed -s file
    

    g— это глобальная команда, dудаляет совпадающие строки, wсохраняет изменения и qзавершает работу.

  • В системе GNU/Linux с Bash и Vim

    vim -e file<<<'g/\v\.(svg|jpg|png)/d|x'
    

    gснова является глобальной командой, \vотключает необходимость выхода за скобки, а xсохраняет изменения.

9
18.03.2021, 23:06

grep подходит лучше.

Создайте файл шаблона, например.:

printf '\\.%s$\n' svg jpg png > patterns.txt

И удалить строки с:

grep -vf patterns.txt url.txt

Или напрямую:

grep -ve "$(printf '\\.%s$\n' svg jpg png)" url.txt

Выход:

https://content.example.net/skin/frontend/2015/default/fonts/test.ttf
https://content.example.net/skin/frontend/2015/default/fonts/test.eot
https://content.example.net/skin/forntend/2015/default/js/test.js
5
18.03.2021, 23:06

с использованием Раку (урожденная Perl 6)

Взяв исходный файл OP url.txtи добавив фиктивную строку, заканчивающуюся на *.txt, вот ответ с использованием Raku:

~$ cat url.txt | raku -ne '.say unless.ends-with( "ttf" | "svg" | "eot" | "js" );' 

ВЫХОД:

https://content.example.net/skin/forntend/2015/default/js/test.txt

Приведенный выше код работает для конкретного случая, когда вы хотите просмотреть концы строк. (он использует процедуру Раку ends-with). Используйте if, если вы хотите выбрать наличие окончания строки; используйте unlessдля выбора наличия окончания строки(unlessэквивалентноif not).

Обратите внимание, что подпрограмма ends-withтакже принимает аргумент :ignorecase(, сокращаемый просто как :i), если у вас есть файлы с именами как jpg, так и JPGи т. д.:

~$ cat url.txt | raku -ne '.say unless.ends-with( "ttf" | "svg" | "eot" | "js", :ignorecase );'

ВЫХОД:

https://content.example.net/skin/forntend/2015/default/js/test.txt

ХТН.

https://raku.org/

2
18.03.2021, 23:06

Теги

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