tr -d, чтобы удалить точную строку символов из строки

Я пытаюсь заставить tr -d удалить строку символов из существующей строки, не удаляя символы везде.

Например, я хочу, чтобы tr удалял : OK с конца каждой строки в foo.txt.

Содержание foo.txt:

BROKEN BONES: OK
Kefen Odvora: OK
BOOKS_FOR_MUM: OK
E: OK Amded: OK

Это команда, которую я запускаю:

cat foo.txt | tr -d ": OK$"

Я хочу, чтобы он выводил это:

BROKEN BONES
Kefen Odvora
BOOKS_FOR_MUM
E: OK Amded

Но вместо этого я получаю это, чего я не хочу:

BRENBNES
efendvora
BS_FR_MUM
EAmded

Как я могу это исправить?

Mac OS X Yosemite, выпуск bash 3.2.57(1)


person leetbacoon    schedule 29.03.2018    source источник


Ответы (2)


Вы используете неправильный инструмент. Вы хотите sed, а не tr:

cat foo.txt | sed 's/: OK$//'

или предпочтительно

sed 's/: OK$//' foo.txt

когда ваш ввод действительно просто файл, а не более сложная команда.


tr -d удаляет все вхождения любого символа в аргументе -d; он не рассматривает его как регулярное выражение для сопоставления и удаления. В частности, вы удаляете все вхождения :, , O, K и $ из каждой строки.

person chepner    schedule 29.03.2018
comment
ИМХО, сэр, нет необходимости использовать cat, так как sed может читать сам Input_file. - person RavinderSingh13; 29.03.2018
comment
Да, я оставил это в качестве заполнителя исходного вопроса на случай, если ввод был выводом более сложной команды. sed 's/: OK$//' foo.txt достаточно, если ввод действительно является просто файлом. - person chepner; 29.03.2018
comment
Замечательно работает, спасибо! И да, я буду использовать это только с текстовыми файлами. Теперь, если бы я использовал это со сложной командой, что бы мне тогда нужно было использовать? - person leetbacoon; 29.03.2018

awk чтобы помочь здесь.

awk '{sub(/: OK$/,"")} 1'  Input_file
person RavinderSingh13    schedule 29.03.2018