使用批处理从匹配字符串的行中删除文本

时间:2012-12-30 21:53:59

标签: regex bash shell batch-file cmd

我需要使用批处理器从包含特定字符串的行中删除文本:SED,AWK,Windows批处理,Unix shell或类似的东西。 如果字符串是“绿色”,则输入以下内容

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 个答案:

答案 0 :(得分:2)

使用sed清空包含green的行:

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

使用sed清空其他行:

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

答案 1 :(得分:2)

Windows命令行/批处理

使用findfindstr

输出非匹配线

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
    )
)

答案 2 :(得分:0)

使用perl:

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

这些命令会将内容输出到stdout,因此将输出重定向到目标文件。

答案 3 :(得分:0)

Sed解决方案如下:

输入.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