删除管道中具有匹配单词的行

删除管道中具有匹配单词的行

我在管道中使用 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"}'

相关内容