我在管道中使用 xlsxgrep 但有一个警告出现在标准输出中而不是被忽略。我想学习如何删除管道本身的那条线。
我的命令:
$ xlsxgrep -riH "${SEARCHTERM}" "${DIR}" >> "${OUTPUTFOLDER}/xlsxgrep-output.txt"
$ awk -F: '{print "\x27"$1"\x27"}' "${OUTPUTFOLDER}/xlsxgrep-output.txt" |
awk '!x[$0]++' |
tee "${OUTPUTFOLDER}/xlsxgrep-output-filename.txt" |
xargs -I {} cp --backup=t {} "${OUTPUTFOLDER}/xlsxgrep-output/"
管道中的错误行:
WARNING *** file size (36373) not 512 + multiple of sector size (512)
WARNING *** OLE2 inconsistency: SSCS size is 0 but SSAT size is non-zero
我不得不考虑使用以下命令删除 sed 匹配“WARNING ***”的两行:
$ sed '/^WARNING \*\*\*/d' "${OUTPUTFOLDER}/xlsxgrep-output.txt"
输出:
'test.xlsx'
'test2.xlsx'
但是当我在管道中添加相同的命令时它不起作用
$ awk -F: '{print "\x27"$1"\x27"}' "${OUTPUTFOLDER}/xlsxgrep-output.txt" |
awk '!x[$0]++' |
sed '/^WARNING \*\*\*/d'
输出:
'test.xlsx'
'WARNING *** file size (36373) not 512 + multiple of sector size (512)'
'WARNING *** OLE2 inconsistency: SSCS size is 0 but SSAT size is non-zero'
'test2.xlsx'
预期输出:
'test.xlsx'
'test2.xlsx'
为什么我的命令不能以正确的方式工作?
答案1
这些警告打印到 stdout 而不是 stderr 似乎很奇怪,但我没有使用此xlsgrep
工具的经验,所以我不知道这是否是预期的,或者它是否可能有控制它的选项。
无论如何,你的sed
失败是因为*
是正则表达式中的特殊字符:它意味着“前一个字符的 0 次或多次重复”。在你的情况下,你有*
一个空格之后,所以*
意味着“0个或多个空格”。我不确定后续的*
解释是什么,GNUsed
会出错,但 busyboxsed
似乎将其视为单个*
.
无论如何,正确的方法是转义*
:
sed '/^WARNING \*\*\*/d'
另请注意,您的awk
命令正在'
行首插入字符:
awk -F: '{print "\x27"$1"\x27"}'
这意味着这WARNING
将不再是第一件事情:
$ echo WARNING | awk -F: '{print "\x27"$1"\x27"}'
'WARNING'
你现在有'WARNING'
.因此,您也需要sed
通过匹配任何字符来考虑这一点:
sed '/^.WARNING \*\*\*/d'
或者通过匹配单引号:
sed "/^'WARNING \*\*\*/d"
或者可能是其他东西,具体取决于原始输入是什么以及中的awk
内容。$1
'{print "\x27"$1"\x27"}'