С sed или awk, как мне сопоставить конец текущей строки с указанным символом? - PullRequest
2 голосов
/ 07 февраля 2010

У меня есть список местоположений файлов в текстовом файле. Например:

/var/lib/mlocate

/var/lib/dpkg/info/mlocate.conffiles

/var/lib/dpkg/info/mlocate.list

/var/lib/dpkg/info/mlocate.md5sums

/var/lib/dpkg/info/mlocate.postinst

/var/lib/dpkg/info/mlocate.postrm

/var/lib/dpkg/info/mlocate.prerm

Я хочу использовать sed или awk для чтения с конца каждой строки до первой косой черты (т. Е. Выбрать фактическое имя файла для каждого адреса файла).

Я немного шокирован синтаксисом для sed и awk. Кто-нибудь может помочь?

Ответы [ 8 ]

5 голосов
/ 07 февраля 2010
$ sed -e 's!^.*/!!' locations.txt
mlocate
mlocate.conffiles
mlocate.list
mlocate.md5sums
mlocate.postinst
mlocate.postrm
mlocate.prerm

Кванторы регулярных выражений являются жадными, что означает, что .* соответствует как можно большей части входных данных.Прочитайте шаблон формы .*X как «последний X в строке».В этом случае мы удаляем все до конца / в каждой строке.

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

$ sed -e 's/^.*\///' locations.txt
4 голосов
/ 07 февраля 2010

Использовать команду basename

$~hawk] basename /var/lib/mlocate
mlocate
3 голосов
/ 07 февраля 2010

Я тоже за "basename", но для полноты, вот одна строчка awk:

awk -F/ 'NF>0{print $NF}' <file.txt
1 голос
/ 07 февраля 2010

Pure Bash:

while read -r line
do
    [[ ${#line} != 0 ]] && echo "${line##*/}"
done < files.txt

Редактировать: Исключить пустые строки.

1 голос
/ 07 февраля 2010

Здесь действительно нет необходимости использовать sed или awk, просто нас basename

IFS=$'\n'
for file in $(cat filelist); do
   basename $file;
done

Если вы хотите вместо каталогов использовать dirname.

0 голосов
/ 10 февраля 2010

Это менее умная, дурацкая версия gbacon's:

sed -e 's/^.*\/\([^\/]*\)$/\1/'
0 голосов
/ 08 февраля 2010

Тиус тоже справился бы, если бы file содержал список путей

 $ xargs -d '\n' -n 1 -a file basename
0 голосов
/ 08 февраля 2010

@ OP, вы можете использовать awk

awk -F"/" 'NF{ print $NF }' file 

NF среднее число полей, $ NF означает получить значение последнего поля

или с оболочкой

while read -r line
do
    line=${line##*/} # means longest match from the front till the "/" 
    [ ! -z  "$line" ] && echo $line
done <"file"

Примечание: если у вас большие файлы, используйте awk.

...