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

2015-11-22 16:15:48 +08:00
 v2htm
根据一个字符串列表,将一个 html 文件内相应的字符串字体加粗

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

强调
重要
突出
夸大
……

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

替换结果为:

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

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

不过替换结果有问题,替换成了<b></b>U<b></b>s<b></b>e<b>…………
每个字母都被替换了
jakezhu
2015-11-22 18:05:21 +08:00
@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
2015-11-22 18:09:13 +08:00
@jakezhu fileA.txt 就是一行一词没有空格空行

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

遍历关键词列表,然后 html_content.replace(keyword, "<b>" + keyword + "</b>")就好了~
luoway
2015-11-22 20:13:08 +08:00
也可以用 Ajax 读取文件,用 JavaScript 修改 document 内容。
jakezhu
2015-11-22 20:27:44 +08:00
@v2htm 最后一条命令改为:
sed -r -i "s#($exp)#<b>\1</b>#g" *.html
v2htm
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
2015-11-22 23:12:23 +08:00
@v2htm 那就得看你平时遇到这种问题多不多了,多的话,学习一下还是有必要的。

word 和 excel 也是很强大的工具
jakezhu
2015-11-22 23:33:12 +08:00
@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
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
2015-11-23 00:09:55 +08:00
@jakezhu 囧,是我浏览器开了货币转换插件,已经没问题了
耽误你不少时间,感激不尽!
Arthur2e5
2015-11-23 04:03:22 +08:00
其实大概用不着这么多工具啊,胶水要用好……
# -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
2015-11-23 04:04:53 +08:00
还有,你的例子大坑啊,后边有个 trailing space 。
v2htm
2015-11-25 23:04:32 +08:00
@Arthur2e5 感谢指导!不过没看明白,测试了一下也没成功

@jakezhu 大神, sed 能排除 html 标签<>里的内容不替换吗?研究了一天 sed ,都是一匹配<>,整行就被跳过了
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
2015-11-26 05:46:18 +08:00
@Arthur2e5 …… lives*

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/238049

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX