Как я могу удалить текст перед разделителем в Linux

16

Мне нужно удалить текст из строки перед разделителем.

Например:

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

Мне нужно удалить текст перед первым :. то есть (123434).

Есть ли в linux команда для выполнения этой задачи?

user80538
источник
Возможно, вы захотите посмотреть sedилиawk
Пол
Является ли этот текст частью файла или частью переменной bash?
Бернхард
Это часть файла.
user80538

Ответы:

14

Эта sedкоманда должна сделать свое дело. Следующая команда перезапишет файл:

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

Чтобы просто напечатать вывод, уберите -iфлаг. Чтобы поместить вывод в новый файл, удалите -iфлаг и перенаправьте вывод:

sed 's/^[^:]*:/:/' file > new_file
DRS
источник
Строка сделала волшебство ... вывод заменен в самом файле ..
user80538
Когда я сравниваю два файла с помощью sdiff, после удаления текста из обоих файлов, разница показывает мне удаленный текст для меня. эта команда перезаписывает файл или просто показывает вывод.
user80538
Это сработало. Могу ли я извлечь «hello» и {apple, orange, mango} из моего примера, внеся простые изменения в приведенную выше команду?
user80538
@ user80538, трудно сказать, что ты хочешь, когда говоришь извлекать в этом контексте. Является ли это частью большого сценария оболочки? Вы можете задать новый вопрос с подробной информацией о более крупной проблеме, которую вы пытаетесь решить.
DRS
Это просто простое сравнение двух файлов с одинаковыми данными, но нужно только найти, где данные отличаются в двух файлах. Мне нужно проверить каждый отдельный раздел в строке. Данные в отдельных разделах могут перемешиваться. как {яблоко, апельсин, манго} может быть {яблоко, манго, апельсин}.
user80538
14

Вы можете использовать cut:

echo '(123434): hello::{apple,orange,mango}.' | cut -d: -f2-
Джозеф Р.
источник
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}.
DRS
есть ли способ изменить команду echo $ {mytext %% B *}, чтобы получить текст после B. в вашем примере
user80538
@ user80538 да, просто обрежьте текст до B включительно ;-), то есть: $ {mytext # * B} для текста после первого B и $ {mytext ## * B} для текста после второго B.