Как я могу различить имена файлов с суффиксом и без него? - PullRequest
0 голосов
/ 23 декабря 2018

Я пишу сценарий оболочки bash для вывода суффиксов имен файлов.

В этом случае я использую:

sed 's|.*\.||'

Так что вывод будет, например:

png
exe
c

Но что мне делать, если в имени файла нет суффикса и, следовательно, нет точки?Мой вывод должен быть «без суффикса», но я не знаю, как это сделать с помощью sed.

РЕДАКТИРОВАТЬ То, что я уже пробовал:

Каталог:

abc.x
abc.y
abc

Вход:

find . -type f | sed -E 's/^[^.]+$/no suffix/; s/.*\.//'

Выход:

x
y
/abc

Ответы [ 6 ]

0 голосов
/ 24 декабря 2018

Использование Perl

/tmp> ls ab*
abc  abc.x  abc.y
/tmp> perl -e ' print /\./? "$_\n" : "no suffix\n" for(glob("ab*")) '
no suffix
abc.x
abc.y
/tmp>
0 голосов
/ 24 декабря 2018

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

[ "$i" = "${i%.*}" ]

См. Руководство программиста Posix - Язык команд оболочки - Расширение параметров

Если он проверяет TRUE, то расширение отсутствует, в противном случае вы можете использовать дополнительное расширение параметра , чтобы получить само расширение, например,

[ "$i" = "${i%.*}" ] && echo "$i - no suffix" || echo "$i - ${i##*.}"

( примечание: вам потребуется дополнительный тест для исключения .foo (например, dotfiles ), но это вам остается)

Оберните это в цикл и исключите файлы каталогаи вы можете проверить каждый файл в каталоге или использовать read в цикле и передать ему список имен.Например, зацикливание файлов в каталоге приведет к:

...
ftlcdfil.c - c
geany-plugin_build_w_gtk+2.patch - patch
geany-plugins.spec - spec
geany.spec - spec
geany_build_w_gtk+2.patch - patch
getfl - no suffix
gtkw_save_test.txt - txt
gtkwrite-master.zip - zip
helloleap - no suffix
helloleap.c - c
jnl - no suffix
messages - no suffix
opensuse_15.0_1s_delay.svg - svg
...
0 голосов
/ 24 декабря 2018
$ cat file
abc.x
abc.y
abc

$ awk -F'.' '{print (NF>1 ? $NF : "no suffix")}' file
x
y
no suffix
0 голосов
/ 23 декабря 2018

Как насчет

sed '/.*\./s///;t;s/.*/no suffix/'

Регулярное выражение сопоставляет строки с точкой.На этих линиях мы выполняем замену.Если замена произошла, мы сделали.В противном случае выполните другую подстановку.

Использование пустого регулярного выражения в шаблоне подстановки использует предыдущий шаблон.Команда t ветвится, если произошла замена;без аргумента мы разветвляемся до конца скрипта.(В противном случае вы можете установить метку с помощью :label и перейти к ней с помощью tlabel.)

0 голосов
/ 23 декабря 2018

Один в awk.Сначала тестовый материал, который не был предоставлен:

$ cat foo
this.foo
that.bar
nothing

The awk:

$ awk '{n=split($0,a,".");print (n>1?a[n]:"no suffix")}' foo
foo
bar
no suffix
0 голосов
/ 23 декабря 2018

Используйте 2 последовательных замены:

sed -E 's/^[^.]+$/no suffix/; s/.+\.//'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...