Мне не ясно, хотите ли вы удалить первый, третий, пятый, ... символ или второй, четвертый, шестой ... символ.
Если первое,
$ echo 'abcdefghijklmnopqr' | perl -pe 's/.(?:(.)|$)/$1/g'
bdfhjlnpr
Если последнее,
$ echo 'abcdefghijklmnopqr' | perl -pe 's/(.)(?:.|$)/$1/g'
acegikmoq
[EDIT: Команды sed
в предыдущей версии ответа не правильно обрабатывали ввод с нечетным количеством символов в строке. ]
Это безразлично к содержимому файла , за исключением , что он сохранит границы строк. Если вы хотите удалить символы новой строки, которые оказываются с нечетным (или четным) смещением от начала файла, вам нужно сделать что-то более сложное - в этот момент я, вероятно, достигну C, поскольку проще игнорировать строку Границы понятны в C, чем с любой из утилит оболочки:
#include <stdio.h>
int main(void)
{
int c1, c2;
for (;;) {
c1 = getchar();
c2 = getchar();
#ifdef PRINT_THE_EVEN_CHARACTERS
if (c1 == EOF || c2 == EOF) break;
putchar(c2);
#else
if (c1 == EOF) break;
putchar(c1);
if (c2 == EOF) break;
#endif
}
return 0;
}