求一脚本:根据字符串列表替换某个文档内相应的字符串 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
v2htm
V2EX    Linux

求一脚本:根据字符串列表替换某个文档内相应的字符串

  •  
  •   v2htm 2015-11-22 16:15:48 +08:00 3414 次点击
    这是一个创建于 3610 天前的主题,其中的信息可能已经有所发展或是发生改变。
    根据一个字符串列表,将一个 html 文件内相应的字符串字体加粗

    假设字符串列表 fileA.txt 内容如下:

    强调
    重要
    突出
    夸大
    ……

    fileB.html 内容包含如下文字:
    “盲目夸大自己经验的重要性,把自己有限的经验、体会套用于所有 问题,过分强调某些突出的症状体征,而忽略其他一般的体征”

    替换结果为:

    “盲目<b>夸大</b>自己平时经验的<b>重要</b>性,把自己有限的经验、体会套用于所有 问题,过分<b>强调</b>某些表面上<b>突出</b>的症状体征,而忽略其他一般的体征”
    21 条回复    2015-11-26 05:46:58 +08:00
    jakezhu
        1
    jakezhu  
       2015-11-22 16:54:52 +08:00   1
    exp=`cat fileA.txt | tr '\n' '|' | sed 's/|$//'`
    sed -r -i "s#($exp)#<b>\1</b>#g" fileB.html
    v2htm
        2
    v2htm  
    OP
       2015-11-22 17:38:22 +08:00
    @jakezhu 哇,非常感谢!我试试
    v2htm
        3
    v2htm  
    OP
       2015-11-22 17:41:04 +08:00
    @jakezhu 错误提示:
    sed: -e expression #1, char 42: Invalid preceding regular expression

    悲催的文科生,希望能再指点一下
    v2htm
        4
    v2htm  
    OP
       2015-11-22 17:48:22 +08:00
    @jakezhu 好了,少了个空格

    不过替换结果有问题,替换成了<b></b>U<b></b>s<b></b>e<b>…………
    每个字母都被替换了
    jakezhu
        5
    jakezhu  
       2015-11-22 18:05:21 +08:00   1
    @v2htm fileA.txt 必须一行一个词,且前后都不能有空格,也不能有空行。上面写的命令对 fileA.txt 格式要求比较高。下面的是兼容版吧。
    exp=`cat fileA.txt | sed -r -e 's/\s+//g' -e '/^$/d' | tr '\n' '|' | sed 's/|$//'`
    sed -r -i "s#($exp)#<b>\1</b>#g" fileB.html
    v2htm
        6
    v2htm  
    OP
       2015-11-22 18:09:13 +08:00
    @jakezhu fileA.txt 就是一行一词没有空格空行

    现在好了,再次感谢!
    v2htm
        7
    v2htm  
    OP
       2015-11-22 19:48:01 +08:00
    @jakezhu 大神,刚才忽略了一个问题, html 文件有很多,怎么样在上边的基础上批量处理当前目录或者某个目录下所有的 html 文件呢?
    virusdefender
        8
    virusdefender  
       2015-11-22 19:52:47 +08:00   1
    可以简单的学一下 Python ,以后这种问题就不用求助别人了~

    遍历关键词列表,然后 html_content.replace(keyword, "<b>" + keyword + "</b>")就好了~
    luoway
        9
    luoway  
       2015-11-22 20:13:08 +08:00
    也可以用 Ajax 读取文件,用 Javascript 修改 document 内容。
    jakezhu
        10
    jakezhu  
       2015-11-22 20:27:44 +08:00   1
    @v2htm 最后一条命令改为:
    sed -r -i "s#($exp)#<b>\1</b>#g" *.html
    v2htm
        11
    v2htm  
    OP
       2015-11-22 22:46:19 +08:00
    @virusdefender 很简单的 shell 脚本我还可以凑合着写个,但是对于没有任何语言基础的文科生来说,面对一个临时遇到的问题时,即使 python 这种简单的语言学习成本也不低啊,所以只好来这里厚着脸皮求助这种也许在你门看起来小儿科的问题。不过你说得对,是该学一下 python 之类的。

    @jakezhu 今天解决了我很大的问题,没想到可以这么方便,几十书几百个文件一下子就搞定了,唯一有点遗憾的是,假设 fileA 列表里包含“ break ”,那么 fileB 里“ She began to skip breakfast and lunch ”会被替换成:
    She began to skip <b>break</b>fast and lunch
    是不是可以加两个空格的标记,只替换完整单词?
    virusdefender
        12
    virusdefender  
       2015-11-22 23:12:23 +08:00
    @v2htm 那就得看你平时遇到这种问题多不多了,多的话,学习一下还是有必要的。

    word 和 excel 也是很强大的工具
    jakezhu
        13
    jakezhu  
       2015-11-22 23:33:12 +08:00   1
    @v2htm 没想到还有英文,这个没考虑到。下面的命令兼容了英文和汉字。
    exp=`cat fileA.txt | sed -r -e 's/\s+//g' -e '/^$/d' | awk '{if($0 ~ "\\\w+"){print "\\\b"$0"\\\b"}else{print}}' | tr '\n' '|' | sed 's/|$//'`
    sed -r -i "s#($exp)#<b>\1</b>#g" *.html
    v2htm
        14
    v2htm  
    OP
       2015-11-23 00:04:43 +08:00
    @jakezhu 全部是英文。。。我没描述清楚,以为用中文举例比较容易明白

    现在的替换结果好像还是把所有字符包括空格都给替换了, fileA 是一行一个词,没有空格和空行
    <b></b> <b></b> <b></b><<b></b>!<b></b>D<b></b>O<b></b>C<b>

    提示: awk: cmd. line:1: ^ invalid char '' in expression
    v2htm
        15
    v2htm  
    OP
       2015-11-23 00:09:55 +08:00
    @jakezhu ,是我浏览器开了货币转换插件,已经没问题了
    耽误你不少时间,感激不尽!
    Arthur2e5
        16
    Arthur2e5  
       2015-11-23 04:03:22 +08:00   1
    其实大概用不着这么多工具啊,胶水要用好……
    # -f 步骤用 sed 生成一个脚本传入给 sed
    sed -f <(sed -e 's/@/\\@/g' -e 's/^/s@/g' -e 's/$/@<b>\\0<\/b>@g/g' word
    ) foo.html
    是的,我完全没用上 ERE 。另外我这里只自动 escape 了一个 at ,要用的话别忘了别的 regex metachar ……

    另外如果你的 shell 不支持 process subst 的话,那么就变成
    括号里的东西 | sed -f - foo.html
    这样读标准输入吧。/dev/stdin 也可以试试。
    Arthur2e5
        17
    Arthur2e5  
       2015-11-23 04:04:53 +08:00
    还有,你的例子大坑啊,后边有个 trailing space 。
    v2htm
        18
    v2htm  
    OP
       2015-11-25 23:04:32 +08:00
    @Arthur2e5 感谢指导!不过没看明白,测试了一下也没成功

    @jakezhu 大神, sed 能排除 html 标签<>里的内容不替换吗?研究了一天 sed ,都是一匹配<>,整行就被跳过了
    Arthur2e5
        19
    Arthur2e5  
       2015-11-26 05:45:45 +08:00
    @v2htm worksforme. 都说了你自己搞 trailng space 喂人吃瘪。我自己打一遍不带空格的:

    test code:
    sed -f <(sed -e 's/@/\\@/g' -e 's/^/s@/g' -e 's/$/@<b>\\0<\/b>@g/g' <<WORD
    强调
    重要
    突出
    夸大
    trailing space
    stupid
    WORD
    )<<TEXT
    “盲目夸大自己经验的重要性,把自己有限的经验、体会套用于所有 问题,过分强调某些突出的症状体征,而忽略其他一般的体征”
    It's stupid to trailing spaces in your pattern file to make people's life suck.
    TEXT

    “盲目夸大自己经验的<b>重要</b>性,把自己有限的经验、体会套用于所有 问题,过分<b>强调</b>某些<b>突出</b>的症状体征,而忽略其他一般的体征”
    It's <b>stupid</b> to <b>trailing space</b>s in your pattern file to make people's life suck.


    我不想做擅自 trim 字符串的事情。你真要的话括号内的那个 sed 自己首先加个 -e 's/[[:space]]+//g'。

    另外, Process substitution requires bash, ksh9x or zsh.
    Arthur2e5
        20
    Arthur2e5  
       2015-11-26 05:46:18 +08:00
    @Arthur2e5 …… lives*
    Arthur2e5
        21
    Arthur2e5  
       2015-11-26 05:46:58 +08:00
    @Arthur2e5 -e 's/[[:space]]+$//g'
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1128 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 26ms UTC 23:17 PVG 07:17 LAX 16:17 JFK 19:17
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86