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 |
3
v2htm OP |
4
v2htm OP |
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 |
7
v2htm OP @jakezhu 大神,刚才忽略了一个问题, html 文件有很多,怎么样在上边的基础上批量处理当前目录或者某个目录下所有的 html 文件呢?
|
8
virusdefender 2015-11-22 19:52:47 +08:00 1
可以简单的学一下 Python ,以后这种问题就不用求助别人了~
遍历关键词列表,然后 html_content.replace(keyword, "<b>" + keyword + "</b>")就好了~ |
9
luoway 2015-11-22 20:13:08 +08:00
也可以用 Ajax 读取文件,用 JavaScript 修改 document 内容。
|
11
v2htm OP @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 是不是可以加两个空格的标记,只替换完整单词? |
12
virusdefender 2015-11-22 23:12:23 +08:00
|
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 |
14
v2htm OP @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 |
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 也可以试试。 |
17
Arthur2e5 2015-11-23 04:04:53 +08:00
还有,你的例子大坑啊,后边有个 trailing space 。
|
18
v2htm OP |
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. |