我在管道中使用 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
我不得不想到使用以下命令删除与“WARNING ***”匹配的 sed 的 2 行:
$ 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'
为什么我的命令不起作用以及如何正确执行此操作?
将这些警告打印到 stdout 而不是 stderr 似乎很奇怪,但我没有使用此
xlsgrep
工具的经验,所以我不知道这是否是预期的,或者它是否有控制它的选项。在任何情况下,你
sed
都失败了,因为*
它是正则表达式中的一个特殊字符:它意味着“前一个字符的 0 次或多次重复”。在你的情况下,你有*
一个空格之后,所以*
意味着“0 个或更多空格”。我不确定后续*
的解释是什么,GNUsed
会出错,但 busyboxsed
似乎将其视为单个*
.无论如何,正确的做法是转义
*
:另外,请注意您的命令在行的开头
awk
插入字符:'
这意味着
WARNING
将不再是第一行:你现在有
'WARNING'
. 因此,您也需要通过匹配任何字符来考虑这一点sed
:或者通过匹配单引号:
或者可能是其他东西,这取决于原始输入是什么,
awk
以及$1
.'{print "\x27"$1"\x27"}'