如何打印 bash 中除最后 n 个字符之外的所有字符?

如何打印 bash 中除最后 n 个字符之外的所有字符?

我正在使用标准输入(cat将两个文件放在一起),并希望结果的最后 10 个字符之外的所有字符都通过下一个命令传递。

我通过搜索所能找到的就是使用sed, awkortr删除每行的最后 n 个字符,或者head, tailorrev删除 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 工具一起使用 :(

答案1

你可以使用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 个字符将出现在一行上,因此您sed也可以使用。将命令输出通过管道传输到:

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

或者如果您sed支持扩展正则表达式:

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

语法类似于perl

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

答案2

你应该使用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()

相关内容