GNU/Linux >> Linux の 問題 >  >> Linux

Lum –出力をPrintfのフォーマットされた印刷のようにフォーマットする方法は?

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

Linux
  1. Linuxコマンドの出力を変数に割り当てる方法

  2. ファイル内の文字列を置き換える方法は?

  3. リダイレクションの使い方を覚える方法は?

  1. sed のようなテキストを python に置き換えるにはどうすればよいですか?

  2. tcpdump:grep可能な出力を取得するには?

  3. ヘッダーを使用して ps 出力を grep する方法

  1. Linuxでコマンド出力をファイルに保存する方法

  2. Du出力をサイズで並べ替える方法は?

  3. ping の出力を止めるには?