[Это основано на ваших -текущих -примерных данных, разделенных пробелами]
Вы можете использовать срез массива в perl
, выбирая индексы, используя grep
и некоторую арифметику по модулю:
perl -anle 'print join "\t", $F[0], @F[grep { !($_ % 4 - 1) } 1..$#F]' file
Кажется, у меня работает:
$ echo -n "^Aword^B" | sed 's/^Aword^B/^Alexical unit^B/' | hexdump -C
00000000 01 6c 65 78 69 63 61 6c 20 75 6e 69 74 02 0a |.lexical unit..|
0000000f
01
представляет собой ^A
; 02
представляет ^B
.
Имейте в виду, что я использовал буквальные управляющие символы, а не знак вставки (^
), за которым следует A
или B
. Чтобы ввести их при создании команды sed
, используйте Ctrl-V , а затем управляющий символ, чтобы вставить его буквально, а не readline
анализировать его как ввод.
Другими словами, чтобы вставить ^A
, нажмите Ctrl-V , а затем Ctrl-A , и вы увидите, что ^A
отображается как ваш Вход. Если вы попытаетесь пройти мимо этого, вы заметите, что ваш курсор всегда рассматривает это как единое целое, даже если оно состоит из двух символов на вашем экране.
В GNU sed \xHH
работает:
$ printf '\001foo\002\n' | sed 's/\x01foo\x02/\x01bar\x02/g' | od -c
0000000 001 b a r 002 \n
Если у вас нет GNU sed, но есть Bash, вы можете использовать кавычки $''
для генерации управляющих символов в оболочке:
$ printf '\001foo\002\n' | sed $'s/\x01foo\x02/\x01bar\x02/g' | od -c
0000000 001 b a r 002 \n
Если у вас нет ни того, ни другого, всегда есть Perl, который тоже понимает\xHH
:
$ printf '\001foo\002\n' | perl -pe 's/\x01foo\x02/\x01bar\x02/g' | od -c
0000000 001 b a r 002 \n
Конечно, вы можете сделать то же самое с -i
.