次のセクションを含むファイルを変更しようとしています。
[ policy_strict ]
countryName = match
stateOrProvinceName = match
organizationName = match
organizationalUnitName = optional
commonName = supplied
emailAddress = optional
[ policy_loose ]
countryName = optional
stateOrProvinceName = optional
localityName = optional
organizationName = optional
organizationalUnitName = optional
commonName = supplied
emailAddress = optional
[ req_distinguished_name ]
countryName = UK
stateOrProvinceName = Scotland
localityName = Glasgow
0.organizationName = aworkplace
organizationalUnitName = eng
commonName = my.webiste.com
emailAddress = [email protected]
common name
最後のセクションのフィールド値を変更したいと思います。
同様の解決策が必要だと思います。このソリューション。
sed '/[シャベル]/,/^$/ s/enable=0/enable=1/'
違いは、置換される値がsedコマンドで一致する式の一部ではないことです。
修正する
コメントに基づいていくつかの説明をすると、目標はそのcommonName
セクションreq_distinguished_name
のフィールドのみを変更することです。例えば
[ policy_strict ]
countryName = match
stateOrProvinceName = match
organizationName = match
organizationalUnitName = optional
commonName = supplied
emailAddress = optional
[ policy_loose ]
countryName = optional
stateOrProvinceName = optional
localityName = optional
organizationName = optional
organizationalUnitName = optional
commonName = supplied
emailAddress = optional
[ req_distinguished_name ]
countryName = UK
stateOrProvinceName = Scotland
localityName = Glasgow
0.organizationName = aworkplace
organizationalUnitName = eng
commonName = adifferentvaluetotheoneintheabovesnippet
emailAddress = [email protected]
答え1
GNU sed拡張正規表現モードでは、-E
範囲演算子を使用して,
正しいブロックを選択し、そのブロック内でs/正規表現/repl/編集のために右行をゼロにします。
sed -Ee '
/\[ req_distinguished_name ]/,/^$/s/^(\s*commonName\s*=).*/\1__NEWVALUE__/
' file
答え2
ファイル内のcommonName属性の値を変更し、名前付き属性のすべての値を変更しようとすると、次のようになります(そしてPCREを想定しています)。
s/(^commonName\s+=\s*)(.*)$/\1<your replacement text here>/
たとえば、新しい値「foo」を設定すると仮定すると、サンプルファイルは次のように実行します。
s/(^commonName\s+=\s*)(.*)$/\1foo/
これにより、他のすべての行は変更されずに残り、commonName値はすべて次に置き換えられます。
commonName = foo
commonName = foo
and
commonName = foo
最後の項目のみを置き換えたい場合は、最も簡単な方法は、セクションの表示が見つかるまでプログラムの前の部分をスキップしてから、最初の項目を上記のs / / /構造に置き換えてから編集を停止することです。
更新:上記のように、最初に編集したいブロックのブロックヘッダーを見つけてから、次のブロックヘッダーに達するまで編集(正規表現置換を適用)してから無視して(PERLなど)、これを実行できます。ファイル部分の残りの部分。 Perlでは、次のように見えます。
#!/usr/bin/env perl -pi.orig
while (<> !~ /\[ req_distinguished_name \]/) { # do nothing
};
while (<> !~ /^\[\s*[\w\d_+]\s*\]/) { s/^(commonName\s*=\s*)(.*)$/\1<repl>/; }
while (!eof()) { <>; }
これにより、コマンドライン引数で指定されたファイルが編集され、変更されていないファイルのバックアップコピーが ".orig"に保存されます。
これはあなたが望むものと非常によく似ているはずです。