Как я могу распечатать все, кроме последних n символов в bash?

Я работаю со стандартным вводом (соединяя два файла вместе) и хочу, чтобы все остальные, кроме последних 10 символов результата, были переданы следующей командой.

Все, что я могу найти при поиске, – это использовать sed , awk или tr чтобы удалить последние n символов из каждой строки, или head , tail или rev чтобы удалить n строк.

Что я могу использовать для этого из стандартного вывода в команду (надеюсь, просто и с помощью одной команды)?

Пример:

 Input: SELECT 'A', 1, GETDATE() UNION ALL SELECT 'B', 2, GETDATE() UNION ALL ... SELECT 'Z', 2, GETDATE() UNION ALL Output: SELECT 'A', 1, GETDATE() UNION ALL SELECT 'B', 2, GETDATE() UNION ALL ... SELECT 'Z', 2, GETDATE() данные Input: SELECT 'A', 1, GETDATE() UNION ALL SELECT 'B', 2, GETDATE() UNION ALL ... SELECT 'Z', 2, GETDATE() UNION ALL Output: SELECT 'A', 1, GETDATE() UNION ALL SELECT 'B', 2, GETDATE() UNION ALL ... SELECT 'Z', 2, GETDATE() 

Для чего это стоит, я использую CygWin в Windows, поэтому он должен быть с довольно стандартными и старыми инструментами unix 🙁

Вы можете использовать head :

 command | head -c-10 

удалит последние 10 байтов из вывода command .

Цитата из man head :

  -c, --bytes=[-]K print the first K bytes of each file; with the leading `-', print all but the last K bytes of each file 

Поскольку вы конкретно указываете, что 10 символов, которые должны быть удалены, будут происходить на одной строке, вы также можете использовать sed . Выполните вывод команды:

 sed '$s/\(.\{10\}\)$//' 

или если ваше sed поддерживает расширенное регулярное выражение:

 sed -r '$s/.{10}$//' 

Синтаксис будет аналогичным с использованием perl :

 perl -pe 's/.{10}$// if eof' 

Вы должны использовать perl :

 $ perl -lpe '$_=substr($_,0,-10) if eof' file SELECT 'A', 1, GETDATE() UNION ALL SELECT 'B', 2, GETDATE() UNION ALL ... SELECT 'Z', 2, GETDATE()