我在一些文件中输入了一些数据。要求是格式化这些文件中的文本内容,并在格式化后添加换行符。
替代要求:
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编写。
答案 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'