文字列を置き換えるスクリプトを作成しましたが、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
(...)を使用して正規表現の左側からグループをキャプチャします。.
従属" "
テキストスペースx 10
乗算(10回)/e
Perlコード/関数/表現式を渡すことを可能にする修飾子(例えば、非常に強力です。
答え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です。すべてのシェルで動作する必要があります。