Как удалить один символ после другого символа в строке с помощью sed

Например

   LINE="ABCDE 123 |@ TEST"

Я хочу удалить символ @, только если он существует после первого "|" персонаж в линии

Команда sed проверит, существует ли символ @ после "|" , и если это правда, sed удалит символ @

другой пример

    LINE="qwe 123 >|@ sdf g"  (before sed action)

    LINE=="qwe 123 >| sdf g"  (after sed action)

Спасибо

3 ответа3

1
 % echo "ABCDE 123 |@ TEST" | sed 's,|@,|,'

по сути, такой же, как ваш другой вопрос.

0

К сожалению, в настоящее время не могу комментировать решение Йенса.

Шаблоны, обсуждаемые в решении Йенса, не отвечают требованию «удалять символ @ только ... после первого символа« | » персонаж'. Соответствующий шаблон будет:

sed 's/\(^[^|]|\)@/\1/'

Это не изменяет линии, которые имеют дополнительную PIPE перед последовательностью PIPE AT.

0

Вы, кажется, задаете много этих вопросов. Я предлагаю ознакомиться с регулярными выражениями, чтобы лучше понять ответы и найти собственные решения. Regular-Expressions.info - хорошая отправная точка.

Чтобы написать регулярное выражение, которое соответствует строкам, содержащим ваш регистр (т. Е. AT после PIPE), вы должны использовать

^.*?\|.*?@

Здесь ^ означает начало .*? соответствует любым символам, но как можно меньше, @ является литералом @, а \| это литерал |, только что экранированный, потому что он имеет особое значение в регулярных выражениях.

Чтобы удалить знак AT, вы указываете sed заменить все предложение всем, кроме знака AT. Для этого вам нужно хранить все, что вы хотите сохранить. Регулярные выражения управляют этим с помощью групп захвата. Вы прибываете в

^(.*?\|.*?)@

Команда sed, которую вы ищете, наконец-то выглядит

sed -r 's/^(.*?|.*?)@/\1/'

Команда "s" обозначает замену, регулярное выражение, которое мы создали, находится между первой парой / (с экранированием скобок и обратной косой черты). Текст, заменяющий совпадение, - это \1 за ним и обозначает содержимое первой группы захвата. Так как мы не захватили AT, это должно сработать.

Надеюсь, что помог. Так как у меня нет sed здесь, это может или не может работать без изменений. знак равно

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .