Видаліть останній символ у слові, але лише якщо символ є - у bash


13

Як видалити останнього символу, лише якщо він є?

вхід:

OpenOffice.org/m
openOffice.org/ozm
Чол.
Pfg.
філ.
Проф.
респ.
Roonstr./m
roonstr./ozm

бажаний вихід:

OpenOffice.org
openOffice.org
Чол
Pfg
філ
Проф
респ
Roonstr
roonstr

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

Відповіді:


13

Вам просто потрібно уникнути крапки у вашій sedкоманді, і все буде добре. Подобається це:

sed 's/\.$//'

Тому що, якщо ви не уникнете цього, він .$буде відповідати будь-якому символу в кінці рядка.

Крім того, ви можете помістити всі ваші sed+ grep+ cutв тільки один sed:

sed 's=/[^/]*$==;s/\.$//' filename

Чудово, дякую, працює! :) Я використовую словник з більш ніж 300k рядків, тому я використовую grep "\". щоб дістати туди лише слова з крапкою.
remolastdotonlyifitsthere

СЕД також може зробити це з чим - л , як це: sed -n '/\./{s=/[^/]*$==;s/\.$//;p}. У будь-якому випадку grep+ sedбуде працювати набагато довше, ніж лише один sed.
пік

Якщо це можна зробити одним седом, було б непогано. Як застосувати останню команду sed?
remolastdotonlyifitsthere

sed 's/[./]\+[^./]*$//'
Пітер.O

Дякую зараз, мені не потрібно вирізати, але греп все ще є. Еквівалент sed моєї команди pipep grep видалить grep, якщо це можливо, було б добре. "Крім того, ви можете помістити всі свої sed + grep + нарізані лише на один sed" для мене не працює, друкує всі слова?
remolastdotonlyifitsthere

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/\.$//'
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.