缩短 sed 替代或可能的替代方案

Shorten sed sustitution or possible alternative

我在几个文件中输入了一些数据。要求是格式化这些文件中的文本内容并添加换行符post格式。

替换要求:

Text      | Substituted
-----------------------
@Network  | #Network
@ Network | #Network
@Daemon   | #Daemon
@ Daemon  | #Daemon
@Service  | #Service
@ Service | #Service
----------------------

我已经尝试使用 sed 来执行此操作,但是该命令变得庞大而混乱,因为替换不仅限于字母 N、D 和 S,而且越来越多的大写字母每天都被添加到要求。

cat results_090316.out | sed -e 's/  //g' -e 's/@N/#N/g' -e 's/@S/#S/g' -e 's/@D/#D/g' -e 's/@ N/#N/g' -e 's/@ S/#S/g' -e 's/@ D/#D/g' | tr '#' '\n'

如果 sed 不是执行此类替换的合适工具,您能否推荐一个替代工具?

代码写在 bash on RHEL 6 / Solaris 10 OS.

您可以使用字符 class 和可选的 space 匹配来缩短它:

sed 's/  //g; s/@ *\([NDS]\)/#/g' results_090316.out

您选择的工具没问题,但您没有充分发挥正则表达式的作用。例如,下面我使用 "character class" 创建自定义字符组来匹配, 例如 [NSD],然后使用 "backreference" (</code>) 通过先 "capturing" 的一段搜索(使用 <code>\(\)):

cat results_090316.out | sed -e 's/  //g' -e 's/@\([NSD]\)/#/g' -e 's/@ \([NSD]\)/#/g' | tr '#' '\n'

但我们可以做得更好,并使用 ? "quantifier"(零个或一个在前的原子)来组合甚至没有 space 和 space 的情况:

cat results_090316.out | sed -e 's/  //g' -e 's/@ \?\([NSD]\)/#/g' | tr '#' '\n'