sedは、テキストをprintfのフォーマットされた印刷のようにフォーマットされた文字列に置き換えることができますか?
次のsedコマンドは、「$ domain」の現在の値で始まる行を、変数で指定されたいくつかの値に置き換えます。
/bin/sed "s/\(^${domain} *${limittype} * ${limititem}.*\)/$EXPL#\1\n${domain} ${limittype} ${limititem} ${value}/" /etc/security/limits.conf
ただし、ドメインなどの値の長さが同じでないため、出力は適切に調整されません。
したがって、出力は次のようになります
#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 one linersドキュメントには、指定された文字数を使用するいくつかの例が含まれています。例:
sed -e :a -e 's/^.\{1,78\}$/ &/;ta' # set at 78 plus 1 space
しかし、これは regexp
にあります replace
にないセクション セクション。
承認された回答:
これは、拡張正規表現構文 -r
を使用します 、多くの混乱を解消します。また、フィールド値のいくつかはすでに知っているので、実際にそれらを逆参照する必要はなく、混乱(およびオーバーヘッド)を減らすことができます。
&コード> は特別な置換値です。一致したパターン全体を保持します。
&
を使用する 、再び混乱を減らします。後方参照ではないため、オーバーヘッドが大幅に少なくなります。
(+)
を使用しました vs. (*)
。 +
入力フィールド間に少なくとも1つのスペースがあることを前提としています。 *
に変更するだけです そうではありません。
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