我有一个文件,其中包含由以下任何不需要的字符分隔的字符串:
<
>
|
- <空格>
它看起来像这样:
... > Test Item|Test Item ...
以上...省略号代表延续。该文件仅由一行组成。
我想修改该文件,以便仅使用单个字符串来分隔字符串<空格>字符。例如:
... Test Item Test Item ...
我sed
尝试过:
sed -e 's/< >*| */|//g' filename
但这返回了以下错误消息:
sed: 0602-404 Function s/< *| */|//g cannot be parsed.
该怎么办?
答案1
试试这个方法:
sed -e 's:<>\s\|.*:Replaced:g' filename
结果就是这样的:
$ echo "<> |" | sed -e 's:<>\s\|.*:Replaced:g'
Replaced
如果您只想删除它,请Replaced
从命令中删除单词。
<
如果符号和之间有空格>
,则应替换<>
为<\s>
。
问题更新后:
$ cat filename
> Test Item|Test Item
< Test Item|Test Item
$ cat filename | sed -E 's:[<>]\s(.*)\|(.*)$:\1 \2:g'
Test Item Test Item
Test Item Test Item
答案2
<> |
如果您希望保留在文件中的数据中不可能出现任何字符,那么几乎可以肯定最有效的解决方案就是将tr
它们完全消除:
tr '<>|' ' ' <infile | ###translate all delimiter chars to spaces
tr -s ' ' >outfile ###pipe results to second tr and squeeze spaces
sed
可能也对你有用,但如果确实如此,几乎肯定会更慢。在使用不基于\n
ewline 分隔符的输入文件以及使用旨在处理\n
ewline 分隔数据的工具时,您应该小心(例如sed
和grep
)因为某些实现可能会在缓冲区压力下崩溃。
你的问题不是(然而)不过,您已经提交了无效的语法作为sed
命令。 @Archemar 已经评论了它是什么,但原因如下:
替换sed
s///
是由三个字段组成的命令:
- 命令
s
原语后跟分隔符(通常/
) - 正则表达式模式字段后跟相同的分隔符
- 替换字段后跟分隔符和可选标志
由于不同的原因,后两者之一或两者可能为零长度 - 也是s///
如此(视上下文而定)可接受的语法。这意味着sed
解析器必须非常依赖分隔符。在您的命令中,您指定了太多字段 - 这是一个语法错误,这就是为什么您的函数无法解析。
如果您的实现sed
可以处理单行输入并且与 POSIX 兼容,那么这应该可以:
sed 'y/<>|/ /;s/ */ /g' <infile >outfile
...y
上面的原语是sed
自己的tr
音译函数。