缩短sed取代或可能的替代

时间:2016-03-09 06:31:19

标签: bash sed substitution

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

替代要求:

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不是执行此类替换的正确工具,您能否提出替代方案?

代码在RHEL 6 / Solaris 10 OS上用bash编写。

2 个答案:

答案 0 :(得分:1)

您可以使用字符类和可选空格匹配缩短它:

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

答案 1 :(得分:0)

您选择的工具没问题,但您没有充分利用正则表达式。例如,下面我使用“字符类”来创建要匹配的自定义字符组,例如 [NSD],然后使用“反向引用”(\1)首先“捕获”一段搜索(使用\(\)):

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

但我们可以做得更好并使用?“量词”(零或一个前任原子)来组合甚至无空间和空间情况:

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