V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
v2htm
V2EX  ›  Linux

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

  •  
  •   v2htm · 2015-11-22 16:15:48 +08:00 · 2854 次点击
    这是一个创建于 3078 天前的主题,其中的信息可能已经有所发展或是发生改变。
    根据一个字符串列表,将一个 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. 都说了你自己搞 trailing 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   ·   我们的愿景   ·   实用小工具   ·   2631 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 01:43 · PVG 09:43 · LAX 18:43 · JFK 21:43
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.