LINUX.ORG.RU

sed: вставить символ между соседними TAB

 ,


0

2

Есть текстовый файл с TAB разделителями полей. Нужно, чтобы в случае, если поле пустое, т.е. идет 2 TAB подряд, между ними вставлялся символ пробела.

sed -e "s/\t\t/\t \t/g"
не подходит, т.к. обрабатывается по 2 TAB в каждом вхождении regexp. В результате в зависимости от номера поля первого вхождения, либо четные, либо нечетные поля остаются пустыми и приходится повторно применять этот regexp. Тогда все вхождения будут заменены:
sed -e "s/\t\t/\t \t/g;s/\t\t/\t \t/g"
Можно ли на sed сделать более короткий regexp? Как он будет выглядеть?


Ты что там такое большое упорно пишешь на sed/bash?

anonymous
()
Ответ на: комментарий от ashot

А лучше так:

php -r "exec(\"perl -pi -e 's/(?<=\t)(?=\t)/ /g' file\")"
Кто-нибудь подскажет, как обернуть это в python 3.4, затем в python 2.7 и запускать это всё в виртуальной машине с windows из под linux контейнера через SSH с получением результата на дисплее Брайля и сверлом в заднице? Больше говнокогда! Интересного и разного!

mr_Heisenberg
()
Ответ на: комментарий от mr_Heisenberg

Ты прежде чем смищно хохмить, вопрос внимательно прочитай. Там не 2 таба в начале строки, а возможно все 22, а может и не в начале, а может и с буковами вперемешку. И где ты в регулярке говнокод обнаружил?

ashot ★★★★
()

Можно ли на sed сделать более короткий regexp?

В сед-гольф играете?

Если нет, то пользуйтесь нормальными языками — вопросов будет куда меньше. Ну, например:

#!/usr/bin/gawk -E

BEGIN {
    FS = OFS = "\t";
}

{
    for (f = 1; f <= NF; f++) {
        if ($f == "")
            $f = " ";
    }
    print;
}

Zmicier ★★★★★
()
Ответ на: комментарий от ashot

Не в том месте сейчас пипетки меряем. Perl - целый язык программирования (и доп зависимость к программе). Sed - стандартная unix команда. Unix команд хватит всем и на всё (но это не точно).

mr_Heisenberg
()
Ответ на: комментарий от mr_Heisenberg

Sed - стандартная unix команда.

Sed - потоковый текстовый редактор (а также язык программирования)
Ничего не имею против sed-а, просто не знаю завезли ли туда конструкции (?= ...) и (?<= ...).

ashot ★★★★
()
Ответ на: комментарий от Zmicier

В сед-гольф играете?

в тексто-дроч

anonymous
()
Ответ на: комментарий от Zmicier

Качество кода, подход и изящность исполнения - моя сильная сторона. Названия и определения - слабая. Так что ты прав :)

mr_Heisenberg
()
Ответ на: комментарий от ashot

Прикольно. С другой стороны на чистейшем html/css тоже игры делают, но от этого они не становятся языками программирования. Просто-напосто sed - невероятно мощный инструмент, как и любая программа стандартного набора unix/linux. Главное научиться использовать эти инструменты, понять как они работают и начать творить чудеса мысли в 1-2 или 3 строчки shell команд.

mr_Heisenberg
()

Можно ли на sed сделать более короткий regexp?
Как он будет выглядеть?

легко. не очень (башекостыль):

sed {,}-e's/\t\t/\t \t/g'

anonymous
()
Ответ на: комментарий от mr_Heisenberg

программа стандартного набора unix/linux

по версии журнала "Юный техник"? Нет никакого "стандартного набора unix/linux". Системы, где не установлен sed (или даже bash) не такая уж редкость. Ты же сам написал, что названия и определения - твоя слабая сторона, но продолжаешь упорствовать.

ashot ★★★★
()
Ответ на: комментарий от mr_Heisenberg

А ещё есть LSB, и то, что де-факто перл и прочие есть на десктопах везде.

anonymous
()
Ответ на: комментарий от mr_Heisenberg

Perl - целый язык программирования (и доп зависимость к программе

эмм, разве перл не из коробки ставится обычно ? Я не вкурсе, больше по python. Тем не менее регекспы через perl - вполне себе нормальный путь. Много где встречал. (жаль, что на python не завезли запуск re через -m, как с json.tool сделано)

Dred ★★★★★
()
Ответ на: комментарий от ashot

Не спорю, бывает, что даже sed не установлен (хотя perl куда чаще). Тут суть в другом - уметь обходится определённым инструментом. Perl умеет принимать поток, как sed?

mr_Heisenberg
()
Ответ на: комментарий от ashot

UNIX - прочитай внимательно, такого слова как «perl» даже близко нет, юный техник. А вот sed - есть. Sed даже в mac os идет по дефолту, а вот perl надо ещё постараться установить.

mr_Heisenberg
()
Ответ на: комментарий от anonymous

Одноплатники, загрузочные флешки. Там где нужен минимализм, ставят ash и кастрируют систему по самое не балуйся.

ashot ★★★★
()
Ответ на: комментарий от mr_Heisenberg

Perl умеет принимать поток, как sed?

да. perl -ne или perl -pe. В зависимости от задачи.

KennyMinigun ★★★★★
()
Последнее исправление: KennyMinigun (всего исправлений: 1)
Ответ на: комментарий от mr_Heisenberg

Perl умеет принимать поток, как sed?

echo A | perl -pe 's/A/B/'
ashot ★★★★
()
Ответ на: комментарий от anonymous

Системы, где не установлен sed (или даже bash) не такая уж редкость.

Примеры?

Масса поставок Андроида.

Zmicier ★★★★★
()
Ответ на: комментарий от Zmicier

Поддержать самого себя от анонима - не в моём стиле. Предпочитаю чётко аргументировать свою позицию. И вести спор не для убеждения, а для поиска истины.

mr_Heisenberg
()
Ответ на: комментарий от mr_Heisenberg

А! Ну просто в данном случае вы взялись раз’яснять чужие слова, причем весьма неочевидным образом — вот я и предположил.

Zmicier ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.