Как мне sed / grep последнее слово в имени файла? - PullRequest
0 голосов
/ 18 декабря 2011

У меня есть несколько имен файлов для разных языков.Мне нужно grep или sed только языковая часть.Я использую gconftool-2 -R / и хочу передать команду для вывода букв с языком.

active = file.so,sv.xml
active = file.so,en_GB.xml
active = file.so,en_US.xml

Мне нужна часть файла sv и en_GB.Как я могу сделать это наиболее эффективным способом?Я думаю о чем-то вроде gconftool-2 -R / | sed -n -e '/active =/p̈́' -e '/\.$/', но потом застреваю, потому что не знаю, как напечатать только ту часть, которая мне нужна, а не всю строку.

Ответы [ 5 ]

5 голосов
/ 18 декабря 2011
awk -F. '{print $(NF-1)}'

NF - количество полей, awk считает от 1, поэтому от 2-го до последнего поля NF-1.
-F.говорит, что поля разделены "."а не пробел

2 голосов
/ 18 декабря 2011

Как насчет использования простого cut

cut -d. -f3 filename

Тест:

[jaypal:~/Temp] cat filename
active = file.so.sv.xml
active = file.so.en_GB.xml
active = file.so.en_US.xml

[jaypal:~/Temp] cut -d. -f3 filename
sv
en_GB
en_US

На основе обновленного ввода:

[jaypal:~/Temp] cat filename
active = file.so,sv.xml
active = file.so,en_GB.xml
active = file.so,en_US.xml

[jaypal:~/Temp] cut -d, -f2 filename | sed 's/\..*//g'
sv
en_GB
en_US

ИЛИ

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

[jaypal:~/Temp] awk -F[,.] '{print $3}' filename
sv
en_GB
en_US

[jaypal:~/Temp] awk -F[,.] '{print $(NF-1)}' filename
sv
en_GB
en_US

ИЛИ

Использование grep и tr:

[jaypal:~/Temp] egrep -o ",\<.[^\.]*\>" f | tr -d ,
sv
en_GB
en_US
1 голос
/ 18 декабря 2011

awk будет моим основным инструментом для этой задачи, но, поскольку это уже было предложено, я добавлю решение, используя cut вместо

cut -d. -f3

т.е. используйте . в качестве разделителя и выберите третье поле.

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

#!/usr/bin/bash 

IFS=.

while read -a LINE;
do
    echo ${LINE[2]}
done < file_name
0 голосов
/ 18 декабря 2011

Это может работать для вас:

gconftool-2 -R / | sed -n 's/^active.*,\([^.]*\).*/\1/p'
0 голосов
/ 18 декабря 2011

Попробуйте:

gconftool-2 -R / | grep '^active = ' | sed 's,\.[^.]\+$,,; s,.*\.,,'

Первая команда sed говорит об удалении точки, за которой следует все, кроме точки, до конца строки; второй говорит убрать все до последней точки.

...