我有其他人编辑过的文件。它们包含如下所示的行:
<E> This is text </E>
我使用一些 Bash shell 脚本对这些文本行执行一系列文本替换功能。但是,为了使文本替换起作用,格式必须完全正确。大多数时候都是这样,但我当然不能指望我从中获取这些文件的编辑者不会犯任何拼写错误。
该格式的一部分是前后各有一个<E>
空格</E>
。不多也不少。所以这些都是不正确的:
<E>This is text </E>
<E> This is text</E>
<E> This is text </E>
<E> This is text </E>
我知道我可以用来sed
搜索具体的问题,比如之前的两个空格</E>
(使用#
而不是/
因为我正在处理的文本也包含/
字符):
sed -i '$ s# </E>#" </E>#g' *.txt
...但我不知道如何用它来搜索未知号码。另外,如果没有空格,则相邻的字符<E>
或</E>
可能是任何字符。
最重要的是,如何搜索分隔文本和标签的零空格和两个或多个空格的实例<E>
,</E>
并将它们转换为一个空格?
答案1
sed -e 's!<E> *!<E> !g' -e 's! *</E>! </E>!g'
(注意:我使用!
而不是#
或/
作为我的正则表达式分隔符。个人喜好。)
sed
可以传递多个命令来在其输入上运行,只要每个命令都以该-e
标志为前缀。
上面正*
则表达式中后面的空格表示“匹配0个或多个空格字符”。手册re_format
页提供了有关此类重复的更多信息:
后跟 ' ' 的原子与包含
*
0 个或多个该原子匹配的序列相匹配。后跟 ' ' 的原子+
匹配该原子的 1 个或多个匹配项的序列。后跟 ' ' 的原子?
匹配该原子的 0 或 1 个匹配序列。
*
其中“原子”是、+
或之前的子模式?
。
在您的示例上运行此sed
命令:
reedm@www:/tmp $ cat > example.txt
<E>This is text </E>
<E> This is text</E>
<E> This is text </E>
<E> This is text </E>
reedm@www:/tmp $ sed -e 's!<E> *!<E> !g' -e 's! *</E>! </E>!g' example.txt
<E> This is text </E>
<E> This is text </E>
<E> This is text </E>
<E> This is text </E>
答案2
“至少一个空格”是/ \+/
“零个或多个空格”是/ */
“不是一个空间”是/[^ ]/
"two or more spaces" is either / */ or / \+/
答案3
echo $STRING | tr -s " "
应消除多个连续的空格字符并将它们减少为单个空格。然后由您决定如何处理该单个空白。
答案4
查看 处理的正则表达式sed(1)
。在下面许多您可以选择\+
重复前面的操作 1 次或多次。所以,sed -i -e 's; \+</E>;</E>;g' *.txt
会删除任何之前的空格数</E>
。看看 GNU sed 的信息手册(我发现pinfo(1)
这是最好的阅读器,但是 YMMV),手册页肯定缺少。在详细节点列表下选中“正则表达式”。