2

在两行文本之间搜索和删除数据的最佳方法是什么,包括第一行但不包括第二行。

字符串 1:SECTION - PAY 500- 待删除

要删除的数据,随机文本行

字符串 2:SECTION - Pay 400- 停留

这是大约 3000 页的 word 文档,但我也有一个文本版本可以使用。我从哪里开始为这样的任务编写 bash 脚本?

文件内容示例:

text 
SECTION - PAY 500    (to be deleted)
text                 (to be deleted)
SECTION - Pay 400
text 
SECTION - PAY 500    (to be deleted)
text                 (to be deleted)
SECTION - Pay 400
text 

删除后应该是这样的结果

text 
SECTION - Pay 400
text
SECTION - Pay 400
text
4

4 回答 4

3

标准解决方案sed

sed "/$START/,/$END/ { /$END/"'!'" d; }"

这意味着对于开始于/$START/和结束于/$END/action的范围,{ /$END/! d; }将完成d(删除)所有非/$END/.

"'!'"很奇怪,但是!从 bash 扩展中逃脱符号的唯一方法。

于 2012-12-28T23:55:45.760 回答
0

我认为您可以很快地逐行解析文件。您要归档的内容似乎并不太复杂,无法实现。

copy=true
while read line; do
    if [ $copy ]; then
        if [[ "$line" == "SECTION - PAY 500"* ]]; then copy=; continue; fi
        echo "$line" >> outputfile
    else
        if [[ "$line" == "SECTION - Pay 400"* ]]; then copy=true; fi
    fi
done < inputfile

通过这样做,我们现在甚至拥有了一台小型图灵机!

于 2012-12-29T00:00:46.080 回答
0

另一个(不那么奇怪;))标准 sed 解决方案: sed "/$END/ p; /$START/,/$END/ d;"

旁注:sed如果需要,某些版本还支持文件的就地编辑。

还有一个完整的 bash 脚本:

#! /bin/bash

if [ "x$1" = "x-r" ]
then
    regex=1
    shift
else
    regex=0
fi

if [ $# -lt 2 ]
then
    echo "Usage: del.sh [-r] start end"
    exit 1
fi

start="$1"
end="$2"

function matches
{
    [[ ( regex -eq 1 && "$1" =~ $2 ) || ( regex -eq 0 && "$1" == "$2" ) ]]
}

del=0
while read line
do
    # end marker, must be printed
    if matches "$line" "$end"
    then
        del=0
    fi
    # start marker, must be deleted
    if matches "$line" "$start"
    then
        del=1
    fi
    if [ $del -eq 0 ]
    then
        echo "$line"
    fi
done
于 2012-12-29T00:13:34.760 回答
0

简单的解决方案:试试这种方式

输入文件.txt

text 
SECTION - PAY 500    
text                 
SECTION - Pay 400
text 
SECTION - PAY 500   
text                 
SECTION - Pay 400
text

代码

awk '/500/{print;getline;next}1' Inputfile.txt | sed '/500/d'

输出

text 
SECTION - Pay 400
text 
SECTION - Pay 400
text 
于 2012-12-29T17:58:09.440 回答