Заменить вкладку для новой строки и удалить новые строки вместе с SED

У меня есть вкладки (пять) между этими словами:

cat dog

и я хочу этот вывод:

cat
dog

Я попробовал это: sed 's/\t/\n/g; /^$/d' pets и вывод был таким же, как и с sed 's/\t/\n/g' pets:

cat




dog

Мне пришлось выполнить sed два раза, чтобы получить то, что я хотел. Вот так sed 's/\t/\n/g' pets>temp после sed '/^$/d' temp

Есть ли способ получить желаемый результат с помощью одной команды?


person Jorge Eduardo    schedule 13.08.2017    source источник
comment
sed 's/[\t][\t]*/\n/g' ? Вы можете исключить нотацию character class (например, [ и ], но они дают понять, что вы обращаетесь к символам. Это зависит от вас. sed 's/\t\t*/\n/g' эквивалентно.   -  person David C. Rankin    schedule 13.08.2017
comment
xargs -n1 также может подойти, вся последовательность символов без пробелов будет отображаться в отдельных строках   -  person Sundeep    schedule 13.08.2017


Ответы (2)


В продолжение моего комментария. Проблема с sed 's/\t/\n/g заключается в том, что вы замените каждый '\t' на '\n'. Вы хотите заменить последовательность вкладок одной новой строкой. Для этого вам нужно:

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

или если вам нравится явно заключать '\t' в [ ], это тоже нормально.

Выражение '\t' соответствует одной вкладке, когда за ним следует '\t\t*', оно соответствует вкладке и нулю или нескольким последующим вкладкам, заменяя последовательность одним '\n', что приводит к желаемому результату. :

cat
dog

g (глобально) в конце просто заменит каждую последовательность одной новой строкой, например.

"cat     dog           fish" 

(разделенные табуляцией), становится

cat
dog
fish

Дайте знать, если у вас появятся вопросы.

person David C. Rankin    schedule 13.08.2017

Если важно количество вкладок, BRE позволит вам указать границы, экранируя фигурные скобки, например так:

$ sed $'s/\t\{5\}/\\\n/' <<<$'one\t\t\t\t\ttwo'
one
two

Обратите внимание, что вы не указали операционную систему, поэтому неизвестно, используете ли вы GNU sed, что позволит вам включать такие вещи, как \t в ваше регулярное выражение. (Я использую FreeBSD и macOS, где sed не имеет такой возможности.) Но вы Упомянули, что используете bash, который поддерживает "расширение формата". Вы можете использовать эту функцию bash для вставки «буквальных» специальных символов в ваш скрипт.

person ghoti    schedule 13.08.2017