免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: FunBSD
打印 上一主题 下一主题

[文本处理] sed如何删除特定段落? [复制链接]

论坛徽章:
28
15-16赛季CBA联赛之八一
日期:2016-02-22 19:10:4215-16赛季CBA联赛之深圳
日期:2016-12-01 10:34:0415-16赛季CBA联赛之新疆
日期:2016-12-07 10:24:2915-16赛季CBA联赛之同曦
日期:2016-12-15 12:06:43CU十四周年纪念徽章
日期:2016-12-18 13:03:4415-16赛季CBA联赛之吉林
日期:2017-01-03 15:52:2515-16赛季CBA联赛之辽宁
日期:2017-01-04 14:58:2415-16赛季CBA联赛之辽宁
日期:2017-01-15 09:42:512016科比退役纪念章
日期:2017-02-06 17:21:50黑曼巴
日期:2017-02-10 15:46:1215-16赛季CBA联赛之上海
日期:2017-03-18 10:14:5415-16赛季CBA联赛之青岛
日期:2017-03-18 22:00:44
11 [报告]
发表于 2016-07-12 11:21 |只看该作者
本帖最后由 moperyblue 于 2016-07-12 16:20 编辑
  1. sed '/bbb]/{:a;$!N;/\n\[/!{s/\n.*//;ta};/bbb]/!P;D}'
复制代码

论坛徽章:
10
15-16赛季CBA联赛之同曦
日期:2016-06-11 19:22:4115-16赛季CBA联赛之深圳
日期:2020-05-31 16:13:5615-16赛季CBA联赛之同曦
日期:2020-01-28 12:42:47每日论坛发贴之星
日期:2016-08-09 06:20:00程序设计版块每日发帖之星
日期:2016-08-09 06:20:00每日论坛发贴之星
日期:2016-07-12 06:20:00程序设计版块每日发帖之星
日期:2016-07-12 06:20:00程序设计版块每日发帖之星
日期:2016-07-06 06:20:00程序设计版块每日发帖之星
日期:2016-07-04 06:20:0015-16赛季CBA联赛之佛山
日期:2021-02-26 09:33:41
12 [报告]
发表于 2016-07-12 13:42 |只看该作者
awk '/[bbb]/{a=0}{if($0!~/[bbb]/&&$0~/^\[/){a=1}}a'

论坛徽章:
6
羊年新春福章
日期:2015-03-03 17:16:28双子座
日期:2015-03-03 17:16:56巳蛇
日期:2015-03-03 17:17:2415-16赛季CBA联赛之福建
日期:2016-03-11 09:05:00黑曼巴
日期:2016-07-07 16:58:1215-16赛季CBA联赛之吉林
日期:2016-11-14 09:23:07
13 [报告]
发表于 2016-07-12 14:10 |只看该作者
  1. awk 'BEGIN{RS=""}{if($1!~/bbb/)print $0}' file
复制代码

论坛徽章:
0
14 [报告]
发表于 2016-07-12 15:14 |只看该作者
本帖最后由 疯子影子 于 2016-07-12 15:16 编辑

#!/bin/sh

declare -A data1 data2
declare -i i=1
declare -i j=1
declare -i index1=0
declare -i index2=0
declare -i num=0

while read a
do
#echo -e "\r\n"
#echo $a
if [ "$a" == "[bbb]" ];then
data1[$index1]=$i
let index1++
elif [ "$a" == "" ];then
data2[$index2]=$j
let index2++
fi
let i++
let j++
done < /data/shell/8.txt

echo -e "\r\n"
declare -A sedarr
for bline in ${data1
  • }
    do
        for spaceline in ${data2
  • };do
            if [ "$spaceline" -gt "$bline" ];then
                    sedarr[$num]=${bline}","${spaceline}"d"
                    let num++
                    break
            fi
        done
    done

    echo -e "\r\n"
    arrlen=${#data1[@]}
    lastIndex=`expr $arrlen - 1`
    if [ "$num" -ne "$arrlen" ];then
    sedarr[$lastIndex]=${data1[$lastIndex]}",\$d"
    fi

    cat /dev/null > /tmp/sed.txt
    echo -n "sed " >> /tmp/sed.txt
    for sedval in ${sedarr
  • };do
            echo -n "-e '"$sedval"' " >> /tmp/sed.txt
    done
    echo -n "/data/shell/8.txt" >> /tmp/sed.txt
  • 论坛徽章:
    2
    程序设计版块每日发帖之星
日期:2015-09-07 06:20:00程序设计版块每日发帖之星
日期:2015-09-07 06:20:00
    15 [报告]
    发表于 2016-07-13 08:45 |只看该作者
    回复 1# FunBSD
    试试这个?
    1. [root@study awksed]# cat file
    2. [bbb]
    3. sdlfjlsdf
    4. lsjdf

    5. [aaa]
    6. asdflj
    7. salfjs
    8. sldfj

    9. [bbb]
    10. sdlfjlsdf
    11. lsjdf

    12. [bbb]
    13. sdlfjlsdf
    14. lsjdf
    15. [root@study awksed]# sed '/\[aaa\]/,/sldfj/!d' file
    16. [aaa]
    17. asdflj
    18. salfjs
    19. sldfj
    复制代码

    论坛徽章:
    0
    16 [报告]
    发表于 2018-09-18 13:10 |只看该作者
    回复 7# yinyuemi

    原来可能测试的不全面。刚又试了一下,这个还是有问题,[bbb]后面的全被删除了。

    论坛徽章:
    0
    17 [报告]
    发表于 2018-09-18 16:04 |只看该作者
    awk '/\[aaa\]/ {b=0} /\[bbb\]/ {b=1} {if (b!=1) print} ' 1
    [aaa]
    asdflj
    salfjs
    sldfj

    论坛徽章:
    0
    18 [报告]
    发表于 2018-09-18 16:38 |只看该作者

    没注意到还有第二页,这个可以用,感谢。

    论坛徽章:
    0
    19 [报告]
    发表于 2018-09-19 09:49 |只看该作者
    本帖最后由 FunBSD 于 2018-09-19 09:55 编辑

    回复 11# moperyblue

    能否解释一下是什么意思,我研究了一下,还是不太明白。下面是我研究的结果:
    sed "/\[abc\]/{:a;$!N;/\n\[/!{s/\n.*//;ta};/\[abc\]/!P;D}"
    1.1: /\[abc\]/               找到包含(\[abc\])的行。
    2.1: :a                      添加标记(a)。
    2.2: $!N                     如果不是文件尾,则读入下一行。
    2.3: /\n\[/!{s/\n.*//;ta}    在遇到(\n\[)前,删除读入的行(s/\n.*//),并跳回标记点(ta)。  --  此处删除的为什么是\n.*,而不是.*?
    3.1: /\[abc\]/!P             输出所有行,但不包括匹配(\[abc\])的行。  --  大写P是什么意思,看不太懂。
    3.2: D                       删除包含(\[abc\])的行。  --  大写D是什么意思,看不太懂。


    论坛徽章:
    0
    20 [报告]
    发表于 2022-09-28 15:15 来自手机 |只看该作者
    p打印当前模式空间所有内容,追加到默认输出之后;P打印当前模式空间开端至\n的内容,并追加到默认输出之前。
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则 发表回复

      

    北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
    未成年举报专区
    中国互联网协会会员  联系我们:huangweiwei@itpub.net
    感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

    清除 Cookies - ChinaUnix - Archiver - WAP - TOP