0

バッチプロセッサ(SED、AWK、Windowsバッチ、Unixシェルなど)を使用して、特定の文字列を含む行からテキストを削除する必要があります。文字列が「緑」の場合、次の入力

red
green 1
blue
green 2
yellow

出力を生成します

red
<EMPTY LINE>
blue
<EMPTY LINE>
yellow

文字列と一致しない行に対しても同じことを行う必要があり、出力を生成します

<EMPTY LINE>
green 1
<EMPTY LINE>
green 2
<EMPTY LINE>

行を削除するのではなく、行からテキストを削除する(行の内容を空にする)必要があります。

4

4 に答える 4

2

Windowsコマンドライン/バッチ

findまたはを使用しfindstrます。

一致しない行を出力する

find /V "green" file.txt

マッチングラインを出力

find "green" file.txt

これらのコマンドは、コンテンツをコンソールに出力します。必要に応じて、出力を宛先ファイルにリダイレクトします。例:

find /V "green" file.txt > nonmatchingoutput.txt

find /?またはを入力findstr /?してヘルプとすべてのオプションを入力します。


更新された質問の更新。

これは、バッチのみを使用してあなたが求めることを行います

:: Hide Commands
@echo off

:: Erase Existing Files
>match.txt ( <nul set /p "=" )
>nomatch.txt ( <nul set /p "=" )

:: Loop through Source and Generate Output
for /f "tokens=1,* delims=]" %%K in ('type temp.txt ^| find /V /N ""') do (
    for /f "delims=" %%X in ('echo(%%L ^| find /V "green"') do (
        echo(%%X>>nomatch.txt
        echo.>>match.txt
    )
    for /f "delims=" %%X in ('echo(%%L ^| find "green"') do (
        echo(%%X>>match.txt
        echo.>>nomatch.txt
    )
)
于 2012-12-30T22:52:48.067 に答える
2

greensedを使用して:を含む空の行

sed '/green/s/.*//' input

そして、sedを使用して他の行を空にします。

sed '/green/!s/.*//' input
于 2012-12-30T22:11:24.297 に答える
0

perlの使用:

# Empty when finding green
perl -pe 's,.*,, if /green/' inputfile
# Empty when not finding green
perl -pe 's,.*,, unless /green/' inputfile

これらのコマンドはコンテンツをstdoutに出力するため、出力を宛先ファイルにリダイレクトします。

于 2012-12-30T22:02:33.303 に答える
0

sedソリューションは以下のとおりです。

Input.txt

red
green 1
blue
green 2
yellow

これを試して

コード1:

$> grep -v green Input.txt  | sed G

また

$> sed '!s/^green//g' Input.txt

red

blue

yellow

コード2:

$> grep green Input.txt  | sed G

また

$> sed -n '/green/p' Input.txt



green 1

green 2
于 2013-01-02T05:34:29.927 に答える