Как использовать скрипты unix для отображения всей группы строк из n символов?


person RubiCon10    schedule 09.07.2010    source источник
comment
В какой оболочке вы пытаетесь это сделать?   -  person Mala    schedule 09.07.2010
comment
Символы новой строки? Могут ли быть многобайтовые символы?   -  person user85509    schedule 09.07.2010
comment
Привет, yahoo.co.jp * - было бы интересно! Но нет, на данный момент мне эта возможность не нужна.   -  person RubiCon10    schedule 09.07.2010


Ответы (2)


sed:

echo "ABCDEFGHIJ" | sed -n ':a;/^...$/{p;b};s/.../&\n/;P;s/.//;s/\n//;ba'

Более обобщенная sed версия:

num=5; echo "ABCDEFGHIJ" | sed -n ":a;/^.\{$num\}\$/{p;b};s/.\{$num\}/&\n/;P;s/.//;s/\n//;ba"

Баш и кш:

string="ABCDEFGHIJ"
for ((i=0;i<=${#string}-3;i++)); do echo ${string:i:3}; done

zsh:

string="ABCDEFGHIJ"
for ((i=1;i<=${#string}-2;i++)); do echo $string[i,i+2]; done

sh (в частности, Dash):

string='ABCDEFGHIJ'
count=$(seq $((${#string}-2)))
for i in $count; do b="$b?"; done
for i in $count; do b="${b%?}"; echo "${string%$b}"; string="${string#?}"; done

AWK:

echo "ABCDEFGHIJ" | awk -v num=4 '{for (i=1; i<length($0)-num;i++) print substr($0,i,num)}'

Изменить: добавлены более общая sed версия и версия AWK.

person Dennis Williamson    schedule 09.07.2010
comment
КЛАССНО! Решение sed работает отлично и с пробелами! Я решил, что 3 точки соответствуют количеству символов, и протестировал его и для других длин !! Превосходно!! - person RubiCon10; 09.07.2010
comment
Просто интересно - нет ли более простого решения с dd и циклом? - person RubiCon10; 09.07.2010
comment
@ RubiCon10: dd? Хм? Я полагаю, вы могли бы что-то скотчем склеить вместе, но я бы использовал одну из петель оболочки в своем ответе, прежде чем пытаться это сделать. Я бы тоже не стал использовать грейдер для обработки клумбы. См. Мою правку для более общей sed версии и версии AWK. - person Dennis Williamson; 09.07.2010

Должен ли он быть основан на оболочке или вы открыты для других языков сценариев? Вот версия на Python:

width = 3
data = open("file").read()
for x in xrange(len(data) - width + 1):
    print data[x : x+width]
person R Samuel Klatchko    schedule 09.07.2010