Як я можу видалити текст перед роздільником у Linux


16

Мені потрібно видалити текст із рядка перед роздільником.

Наприклад:

(123434): hello::{apple,orange,mango}.

Мені потрібно видалити текст до початку :. тобто (123434).

Чи є якась команда в Linux для виконання цього завдання?


Ви можете захотіти поглянути на sedабоawk
Пол

Це текстова частина файлу чи частина змінної bash?
Бернхард

Це частина файлу.
user80538

Відповіді:


14

Ця sedкоманда повинна виконати трюк. Наступна команда замінить файл:

sed -i 's/^[^:]*:/:/' file

Щоб просто надрукувати вихід, зніміть -iпрапор. Щоб помістити вихід у новий файл, видаліть -iпрапор і перенаправіть вихід:

sed 's/^[^:]*:/:/' file > new_file

Рядок зробив магію ... вихід замінили у самому файлі ..
user80538

коли я порівнюю два файли за допомогою sdiff, після видалення тексту з обох файлів різниця показує видалений текст для мене. ця команда перезаписує файл або просто показує вихід.
user80538

Це спрацювало. Чи можу я витягнути "привіт" і {яблуко, апельсин, манго} зі свого прикладу, внісши прості зміни у вищевказану команду?
user80538

@ user80538, Важко сказати, що ти хочеш, коли кажеш витяг у цьому контексті. Це частина більшого сценарію оболонки? Можливо, ви захочете задати нове запитання з деталями більшої проблеми, яку ви намагаєтеся вирішити.
DRS

Це просто просте порівняння двох файлів з однаковими даними, але потрібно лише знайти, де дані відрізняються у двох файлах. Мені потрібно перевірити кожен окремий розділ у рядку. Дані в окремих розділах можуть змінюватися. як {яблуко, апельсин, манго} може бути {яблуко, манго, апельсин}.
user80538


5

Це можна зробити за допомогою досить простої інструкції Bash :

mytext="(123434): hello::{apple,orange,mango}."

echo ${mytext#*)}

Це надрукується : hello::{apple,orange,mango}.. Ви можете вирізати префікси та суфікси аналогічним чином. Більше того, визначення префікса та суфіксу можуть містити підстановки.

Вирізати префікс - до першого збігу підстановочних символів префіксу: ${variable#prefix}

Вирізати префікс - до останнього збігу підстановки підстановки: ${variable##prefix}

Вирізати суфікс - до першого збігу підстановочних символів суфіксу: ${variable%suffix}

Вирізати суфікс - до останнього збігу підстановочних символів суфіксу: ${variable%%suffix}

На перший погляд це може виглядати незрозуміло, див. Наступний приклад:

mytext="xAxBxAxBx"
echo ${mytext#*A}    # will print: xBxAxBx
echo ${mytext##*A}   # will print: xBx
echo ${mytext%B*}    # will print: xAxBxAx
echo ${mytext%%B*}   # will print: xAx
echo ${mytext%%C*}   # will print: xAxBxAxBx

В останньому прикладі шаблон не збігається, тому нічого не вирізати.


Це було б більш надійним у використанні echo ${mytext#*:}:. Це правильно обробляє такі лінії, як (123)(434): hello::{apple,orange,mango}.і 123434: hello::{apple,orange,mango}.
пр.

чи є спосіб змінити команду echo $ {mytext %% B *}, щоб отримати текст після B. у своєму прикладі
user80538,

@ user80538 так, просто виріжте текст перед B, включно ;-), тобто: $ {mytext # * B} для тексту після першого B, і $ {mytext ## * B} для тексту після другого B.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.