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
С гну сэд
echo "hi,my,name,is" | sed 's/,/\n/g' | sed -z 's/\n/,/g'
Попробуйте:
$ 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 '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