web-dev-qa-db-ja.com

bashの最後のn文字を除くすべてを印刷するにはどうすればよいですか?

標準入力(2つのファイルを一緒にcating)で作業しており、結果の最後の10文字を除くすべてを次のコマンドに渡す必要があります。

検索で見つけることができるのは、sedawkまたはtrを使用して各行から最後のn文字を削除するか、headtailまたは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()

価値があるので、私はWindowsでCygWinを使用しているので、かなり標準的で古いUNIXツールを使用する必要があります:(

3
Ehryk

headを使用できます:

command | head -c-10

command出力から最後の10バイトを削除します。

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文字が1行に表示されると具体的に述べているので、sedも使用できます。コマンド出力を次の場所にパイプします。

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

または、sedが拡張正規表現をサポートしている場合:

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

構文は、Perlを使用して同様になります。

Perl -pe 's/.{10}$// if eof'
6
devnull

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()
3
cuonglm