我正在使用标准输入(cat
将两个文件放在一起),并希望结果的最后 10 个字符之外的所有字符都通过下一个命令传递。
我通过搜索所能找到的就是使用sed
, awk
ortr
删除每行的最后 n 个字符,或者head
, tail
orrev
删除 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()