缩短 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'
我在几个文件中输入了一些数据。要求是格式化这些文件中的文本内容并添加换行符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'