Замена нескольких баров (специальный символ) на вкладку с помощью sed - PullRequest
2 голосов
/ 12 апреля 2010

У меня есть такая строка

BRADI5G20430|BRADI5G20430.1||1

Как заменить панель (одиночную и множественную) на вкладку ("\ t")? Я пробовал это, но не работает

sed 's/\|+/\t/g'

Я также хочу включить эту строку в скрипт bash.

Ответы [ 4 ]

3 голосов
/ 12 апреля 2010

вам нужно сбежать +

$ sed 's/|\+/\t/g' file
BRADI5G20430    BRADI5G20430.1  1

или вы можете использовать -r опцию sed, но на этот раз + будет "один или несколько", и вам нужно экранировать "|" поскольку в регулярном выражении это означает чередование.

$ sed -r 's/\|+/\t/g' file
BRADI5G20430    BRADI5G20430.1  1

или используйте awk, установите разделитель полей на «|» а затем установите разделитель выходного поля OFS на вкладку \t

например

$ awk -F"|" '{$1=$1}1' OFS="\t" file
BRADI5G20430    BRADI5G20430.1          1

это заменяет каждую вкладку на "|". Если вы хотите заменить все "|" с одной вкладкой

$ awk '{gsub(/\|+/,"\t")}1' file
BRADI5G20430    BRADI5G20430.1  1
2 голосов
/ 12 апреля 2010

Я считаю, что команда, которую вы ищете, на самом деле

sed -e 's/[|]\{1,\}/\t/g'

Sed не использует синтаксис + для одного или более, но позволяет вам указать число повторений с открытым концом. См. здесь для получения дополнительной информации.

1 голос
/ 12 апреля 2010

Как это не сработало?

Подсказка: если вы видите, как это не работает, вы должны увидеть, что нужно сделать, чтобы это заработало - попробуйте удалить детали и посмотреть, как меняется поведение.

Подсказка # 2: это часть +, которую sed не распознает.

sed 's/\|\|*/\t/g'

1 голос
/ 12 апреля 2010

Не совсем уверен, почему + не работает, но это будет:

$ echo  "BRADI5G20430|BRADI5G20430.1||1" | sed -e 's/\|\{1,\}/\t/g'
BRADI5G20430\tBRADI5G20430.1\t1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...