Заменить символы новой строки на sed (a la tr) [duplicate]

perl -pi -e 's|\d+|$&/2|e if $. == 1; close ARGV if eof' ./*.txt

Заменит первую последовательность десятичных цифр в первой строке каждого нескрытого txtфайла в текущем каталоге каноническим десятичным представлением половины соответствующего числа. (например, 3 для 006, 3,5 для 007).

Если число очень большое (например, больше 1e20), perlможет переключиться на инженерную нотацию (5e+19).

Очевидно, что этот подход действителен только для десятичных целых чисел. Применительно к .1это даст .5вместо 0,05; применительно к 1,5 это даст 0,5,5вместо 0,75; применительно к 0x10это даст 0x10(только 0уменьшено вдвое) вместо 8 или 0x8 и так далее.

Если вы хотите обрабатывать десятичные числа в любой нотации (1, 010 (означает 10, а не восьмеричное 8), -1,123, 2,23e-4, inf, бесконечность, NaN...)), вам нужно адаптируйте соответствующее регулярное выражение, например:

s{(\d*\.\d+|\d+\.?)(e[-+]?\d+)?|nan|inf(inity)?}{$&/2}ie

Или сделайте некоторое предположение о том, где находится число в строке, например, если это первая последовательность символов без пробелов:

s{\S+}{$&/2}e
1
09.03.2018, 22:10
2 ответа

С гну сэд

echo "hi,my,name,is" | sed 's/,/\n/g' | sed -z 's/\n/,/g'
1
27.01.2020, 23:14

Попробуйте:

$ sed 'H;1h;$!d;x; s/\n/,/g' out.txt
hi,my,name,is

По умолчанию sed считывает только одну строку за раз, обрабатывает ее и печатает. Поскольку в одной строке никогда не бывает символа новой строки, команда s/\n/,/gничего не делает. Решение, как указано выше, состоит в том, чтобы прочитать весь файл сразу, а затем выполнить s/\n/,/g.

Команды H;1h;$!d;xчитают сразу весь файл. Это, вероятно, проще всего думать об этом как об идиоме. Если вы действительно хотите знать кровавые подробности:

  • H-Добавить текущую строку для удержания пробела
  • 1h-Если это первая строка, перезаписать пробел с ним
  • $!d-Если это не последняя строка, удалить место шаблона и перейти на следующую строку.
  • x-Обмен удержанием и пространством шаблона для помещения всего файла пространство шаблонов

Альтернативный :awk

$ awk 'NR>1{printf ","} {printf "%s",$0} END{print""}' out.txt
hi,my,name,is

или:

$ awk '{printf "%s%s",(NR==1?"":","),$0} END{print""}' out.txt
hi,my,name,is
5
27.01.2020, 23:14

Теги

Похожие вопросы