sedを使用して10個の空白文字を追加します。

sedを使用して10個の空白文字を追加します。

文字列を置き換えるスクリプトを作成しましたが、10個の空白文字を再追加する必要があります。私できるスペースバーを10回押すと再び追加され動作しますが、私のスクリプトではひどいようです。

私のスクリプト: sed -i 's/server.os[ \t]*$freebsd/server.os $linux/g' ~/var/log.txt

次のようなものを使用して、server.os間に10個の空白文字を追加したいと思います。$linux{whitespace*10}

メモ:

  • 前に 10 個の空白文字があるので、$freebsd次を使用します。[ \t]*
  • $この場合、変数ではありません。それは文字列の一部にすぎません。

入力例: server.os $freebsd

希望の出力: server.os $linux

答え1

何でもキャプチャしてください(10、それ以上、より少ないまたはなし)元の文字列で連続したスペースとタブをグループ化し、([ \t])エスケープ参照番号に基づいて代替文字列に戻します。\1この場合、次のようになります。

sed -E 's/server\.os([ \t]*)\$freebsd/server.os\1$linux/g'

注:左側のすべての項目は正規表現として処理されるため、.およびをエスケープする必要があります。$

答え2

既存のスペースをキャプチャする必要がある場合(新しいユースケース):

$ sed 's/\(server.os[ \t]*\$\)freebsd/\1linux/' file
server.os          $linux

存在しないスペースを作成する必要がある場合(以前のユースケース):

入力ファイル:

$ cat file
server.os $freebsd

sedリクエストに応じてGNUを使用してください。

自分の責任で使用してください。

sed -E 's/(server\.os[ \t]*\$)freebsd.*/printf "%s%10s" \1 linux/e' file

そしてPerl

$ perl -pe 's/(server\.os)[ \t]*\$freebsd.*/$1 . " " x 10 . "linux"/e' file
server.os           $linux

を使用すると、-i次のように動作しますsed -i待ち行列

交換部品の動作方法は次のとおりです。

  1. $1(...)を使用して正規表現の左側からグループをキャプチャします。
  2. .従属
  3. " "テキストスペース
  4. x 10乗算(10回)
  5. /ePerlコード/関数/表現式を渡すことを可能にする修飾子(例えば、非常に強力です。

答え3

source_txt='server.os[ \t]*$freebsd'
replace_txt=$(printf 'server.os%10s$linux')
sed -i "s/$source_txt/$replace_txt/g" ~/var/log.txt

printfこれはリッチテキストを作成するために使用されます。バラよりマニュアルページ助けを求める。組み込みシェルとPOSIXです。すべてのシェルで動作する必要があります。

関連情報