Удалить последний символ в слове, но только если он есть - в bash

13

Как убрать последний символ только если он там есть?

вход:

OpenOffice.org/m
openOffice.org/ozm
Чел.
Pfg.
Фил.
Профессор
соответственно
Roonstr./m
roonstr./ozm

желаемый результат:

OpenOffice.org
openOffice.org
Pers
Pfg
Фил
профессор
соответственно
Roonstr
roonstr

Я дошел до того, что осталась только точка, но, к сожалению, последняя команда sed также удаляет и буквы g: $ cat filename | grep "\." | cut -d"/" -f1 | sed 's/.$//'

removelastdotonlyifitsthere
источник

Ответы:

13

Вам просто нужно избежать точки в вашей sedкоманде, и все будет хорошо. Как это:

sed 's/\.$//'

Потому что в случае, если вы не избежите этого, .$будет соответствовать любому символу в конце строки.

Также вы можете поместить все свои sed+ grep+ cutв один sed:

sed 's=/[^/]*$==;s/\.$//' filename
порыв
источник
Отлично, спасибо, работает! :) Я использую словарь с более чем 300 тыс. Строк, поэтому я использую grep "\." чтобы получить только слова с точкой.
удалить последние два дня здесь
СЭД также может сделать это с чем - л , как это: sed -n '/\./{s=/[^/]*$==;s/\.$//;p}. В любом случае grep+ sedбудет работать намного дольше, чем один sed.
Раш
Если это можно сделать с помощью одного седа, было бы неплохо. Как применить вашу последнюю команду sed?
удалить последние два дня здесь
sed 's/[./]\+[^./]*$//'
Peter.O
Спасибо, теперь мне не нужно вырезать, но grep все еще там. Sed-эквивалент моей команды piped grep удалит grep, чтобы, если это возможно, было бы неплохо. «Кроме того, вы можете положить все свои sed + grep + нарезать только на один sed» у меня не работает, печатает все слова?
удалить последние два дня здесь
1

Удаление символа только в том случае, если оно есть, есть в точности описание расширения параметров.

 $ var=path.
 $ echo "$var    ${var%.}"
 path.    path

Точка не является особенной в этом случае (точка является особенной в регулярном выражении).

Другой шаблон можно удалить с помощью %/*:

 $ var=openOffice.org/ozm
 $ echo "${var%/*}"
 openOffice.org

Чтобы удалить оба:

 $ var=roonstr./ozm
 $ var=${var%/*}
 $ var=${var%.}
 $ echo "$var"
 roonstr

Конечно, для работы с исходным файлом быстрее использовать sed для этого файла.
Только не забудьте заключить в кавычки точку (чтобы соответствовать ей буквально, иначе это означает: любой символ).

 $ sed 's,/.*,,;s,\.$,,' file
Исаак
источник
Это должен быть принятый ответ. Нужно больше голосов.
Дэвид Паркс
0

Просто слегка поменяйте свое регулярное выражение: убегать . И не нужноgrep

cat filename | cut -d"/" -f1 | sed 's/\.$//'
medifle
источник