试着把我的个人科幻书PDF转换成电子书。我将所有行收集到一个连续的段落中的中间步骤是正确的排序,但我最终得到了一些不正确的字符串序列,因为它们是从转换工具中输出的,或者是我的排序过程中的随机情况。
在以下测试脚本中确定了违规字符串序列:
{
cat <<-EnDoFiNpUt
"I will do it," he said.
He said,"Be there ... or be square!"
He said",Be there ... or be square!"
They yelled:"Why now?"
Tell them "No"!{end-of-lineORspace}
EnDoFiNpUt
} |
sed 's+[a-zA-Z0-9]",[A-Z]+{somethingThree}+g' | (line 3)
sed 's+[a-zA-Z0-9],"[A-Z]+{somethingTwo}+g' | (line 2)
sed 's+[a-zA-Z0-9]:"[A-Z]+{somethingFour}+g' | (line 4)
sed 's+[a-zA-Z0-9]"[!]$+{somethingFive}+g' | (line 5)
sed 's+[a-zA-Z0-9],"\ [A-Z]+{somethingOne}+g' (line 1)
字符串
我的期望输出应该是这样的(* 不带'^'s * 的行):
"I will do it", he said.
^^^
He said, "Be there ... or be square!"
^^^
He said, "Be there ... or be square!" (same result for 2nd scenario)
^^^
They yelled: "Why now?"
^^^
Tell them "No!"
^^^
型
问题是,我在模式之前和之后指定了一个字符(alphanum)的存在,但我只想替换正在交换的字符串,保留在这些示例之前或之后匹配的字符。
由于我对sed的理解有限,唯一一个与我自己的问题接近的帖子是this,但我无法破译它,更不用说尝试自己的手使用技术解决我的问题了。
我更喜欢做一个post-collection sed操作,而不是重新编写我已经很复杂的awk逻辑来进行段落识别和校对。
谁能告诉我如何在这些场景中做到这一点?
2条答案
按热度按时间uxh89sit1#
您可能希望使用捕获组,从而可以在脚本的后半部分使用数字反向引用来引用一组括号内的内容。
一个简单的例子:
字符串
地点:
-E
-启用扩展正则表达式,并允许使用parens来指定捕获组;如果没有-E
,则需要转义每个paren(例如,sed 's/\(A\)\(B\)\(C\)/\1x\2y\3/'
)(A)
(B)
(C)
-(定义)第一、第二和第三捕获组\1
\2
\3
-(使用/参考)第1、第2和第3个捕获组关注将逗号移动到引号字符串的“外部”的要求...
再看一对要求:
型
使用文件作为示例输入:
型
测试
sed
脚本:型
合并为一个复合
sed
脚本:型
注意事项:
!
之后添加一个空格?)),但一个捕获组可能也会在那里派上用场sed
脚本时遇到问题,那么我建议你问一个新的问题,这个问题只关注你遇到问题的sed
脚本awk
脚本;请记住,我们在这里使用sed
* 所做的一切都可以在awk
中完成,并且会更有效(即,不需要为sed
脚本生成单独的(子)进程)yb3bgrhw2#
使用
sed
字符串