Unix bash Sed 命令组合在一个文件上

Unix bash Sed 命令组合在一个文件上

我有一个文件,其中包含由以下任何不需要的字符分隔的字符串:

  1. <
  2. >
  3. |
  4. <空格>

它看起来像这样:

...  > 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 可能也对你有用,但如果确实如此,几乎肯定会更慢。在使用不基于\newline 分隔符的输入文件以及使用旨在处理\newline 分隔数据的工具时,您应该小心(例如sedgrep因为某些实现可能会在缓冲区压力下崩溃。

你的问题不是(然而)不过,您已经提交了无效的语法作为sed命令。 @Archemar 已经评论了它是什么,但原因如下:

替换sed s///是由三个字段组成的命令:

  1. 命令s原语后跟分隔符(通常/
  2. 正则表达式模式字段后跟相同的分隔符
  3. 替换字段后跟分隔符和可选标志

由于不同的原因,后两者之一或两者可能为零长度 - 也是s///如此(视上下文而定)可接受的语法。这意味着sed解析器必须非常依赖分隔符。在您的命令中,您指定了太多字段 - 这是一个语法错误,这就是为什么您的函数无法解析

如果您的实现sed可以处理单行输入并且与 POSIX 兼容,那么这应该可以:

sed 'y/<>|/   /;s/  */ /g' <infile >outfile

...y上面的原语是sed自己的tr音译函数。

相关内容