sed可以用类似于printf的格式化打印格式的字符串替换文本吗?
以下sed命令用变量中指定的多个值替换以“ $ domain”的当前值开头的行。
/bin/sed "s/\(^${domain} *${limittype} * ${limititem}.*\)/$EXPL#\1\n${domain} ${limittype} ${limititem} ${value}/" /etc/security/limits.conf
但是,由于domain等的值的长度不同,因此无法正确对齐输出。
所以输出将是这样的
#oracle hard nproc 131072
oracle hard nproc 666
虽然有效,但很难阅读。我希望得到类似的东西
#oracle hard nproc 131072
oracle hard nproc 666
我可以拿到的最好的输出是:
/bin/sed "s/\(^${domain}\)\( *\)\(${limittype}\)\( *\)\(${limititem}\)\( *\)\(.*\)/$EXPL#\1\2\3\4\5\6\7\n${domain}\2${limittype}\4${limititem}\6${value}/" /etc/security/limits.conf
但是我相信必须有一种更优雅的方法来做到这一点。
所述sed的一个衬里文件包含一些实例中使用指定数目的字符,例如
sed -e :a -e 's/^.\{1,78\}$/ &/;ta' # set at 78 plus 1 space
但这regexp
不在本replacement
节中。
这使用扩展的regex语法-r
,可以消除很多混乱情况。另外,由于您已经知道某些字段值,因此实际上不需要反向引用它们,从而再次减少了混乱(和开销)。
&
是一个特殊的替换值:它包含整个匹配的模式。使用&
,同样可以减少混乱。由于它不是反向引用,因此开销大大减少。
我用( +)
对比( *)
。在+
假定有输入字段之间的至少一个空间。只是将其更改为*
事实并非如此。
EXPL=
dom=oracle
typ=hard
itm=nproc
val=666
echo "oracle hard nproc 131072" |
sed -r "s/^$dom( +)$typ( +)$itm( +).*/$EXPL#&\n$dom\1$typ\2$itm\3$val/"
输出
#oracle hard nproc 131072
oracle hard nproc 666
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句