パイプラインで一致する単語を含む行を削除する

パイプラインで一致する単語を含む行を削除する

パイプラインでxlsxgrepを使用していますが、無視されるのではなくstdoutに警告が表示されます。パイプ自体からその行を削除する方法を学びたいです。

私のコマンド:

$ 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 ***」に一致する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'

私のコマンドが正しい方法で動作しないのはなぜですか?

答え1

これらの警告がstderrの代わりにstdoutに印刷されるのは奇妙に見えますが、このツールの経験がないため、xlsgrepこれが予想されるかどうかを制御するオプションがあるかどうかはわかりません。

とにかく、あなたのsed失敗は*正規表現の特殊文字によって引き起こされます。これは、「前の文字が0回以上繰り返される」ことを意味します。あなたの場合、*それの後にスペースがあるので、*「0個以上のスペース」を意味します。後続の説明が何であるかよくわかりません*。 GNUではsedエラーが発生しますが、busyboxはsedこれを単一です*

とにかく正しい方法は脱出することです*

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"}'

関連情報