2014-10-29 2 views
2

У меня есть файл с именем test.txt, который имеет:Удалить весь текст из последней точки в Баш

abc.cde.ccd.eed.12345.5678.txt 
abcd.cdde.ccdd.eaed.12346.5688.txt 
aabc.cade.cacd.eaed.13345.5078.txt 
abzc.cdae.ccda.eaed.29345.1678.txt 
abac.cdae.cacd.eead.18145.2678.txt 
aabc.cdve.cncd.ened.19945.2345.txt 

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

cde.ccd.eed.12345.5678.txt 
cdde.ccdd.eaed.12346.5688.txt 
cade.cacd.eaed.13345.5078.txt 
cdae.ccda.eaed.29345.1678.txt 
cdae.cacd.eead.18145.2678.txt 
cdve.cncd.ened.19945.2345.txt 

Тогда я сделаю

for i in `cat test.txt`; do echo ${i#*.}; done 

, но если я хочу удалить все после последнего .:

abc.cde.ccd.eed.12345.5678 
abcd.cdde.ccdd.eaed.12346.5688 
aabc.cade.cacd.eaed.13345.5078 
abzc.cdae.ccda.eaed.29345.1678 
abac.cdae.cacd.eead.18145.2678 
aabc.cdve.cncd.ened.19945.2345 

Что мне делать?

+0

См [BASH FAQ # 1] (http://mywiki.wooledge.org/BashFAQ/001) для правильного пути, чтобы прочитать файл линию за линией , Не используйте цикл 'for'. – chepner

ответ

14

С AWK:

awk 'BEGIN{FS=OFS="."} NF--' file 

В случае нет пустых строк, это работает. Он устанавливает разделители полей ввода и вывода на точку .. Затем уменьшает количество полей в одном, так что последний сохраняется. Затем он выполняет действие по умолчанию awk: {print $0}, т. Е. Распечатать строку.

С sed:

sed 's/\.[^.]*$//' file 

Это ловит последний блок . + text + end of line и заменяет его ни с чем. То есть, он удаляет его.

С rev и cut:

rev file | cut -d'.' -f2- | rev 

rev меняет линию, так что cut может печатать со 2-го слова до конца. Затем, rev назад, чтобы получить правильный вывод.

bash С:

while ISF= read -r line 
do 
    echo "${line%.*}" 
done < file 

Это выполнить операцию строку, состоящую в замене самый короткий матч .* с конца переменной $line контента.

С grep:

grep -Po '.*(?=\.)' file 

Посмотрите вперед, чтобы печатать только то, что до последней точки.

Все они вернутся:

abc.cde.ccd.eed.12345.5678 
abcd.cdde.ccdd.eaed.12346.5688 
aabc.cade.cacd.eaed.13345.5078 
abzc.cdae.ccda.eaed.29345.1678 
abac.cdae.cacd.eead.18145.2678 
aabc.cdve.cncd.ened.19945.2345 
+1

'grep -Po '. * (? = \.)'' Попросить присоединиться к семье ... – Kent

+0

@ Kent с удовольствием :) – fedorqui

+1

'grep' говорит спасибо и +1 – Kent

Смежные вопросы