2017-11-15 15 views
1

私はbashスクリプトで新しく、特定の行の数値を別の値に変更するソリューションを探しています。 という名前のファイルがfoo.configであり、このファイルには約100行の設定があります。 たとえば、私が特定の行の別の値にバッシュ番号を変更する

<UpdateInterval>2</UpdateInterval>

を持っていると私は(これは、0〜10の番号も、私の例えば2であることができます)0のためいつものようにfoo.configにこのラインを見つけて、数を交換する必要があります。このよう

<UpdateInterval>0</UpdateInterval>

私はSEDでそれをどのように行うことができますか?

ラインの一部で提案してください:非常に単純な方法で

<InstallUrl /> 
<TargetCulture>en</TargetCulture> 
<ApplicationVersion>1.0.1.8</ApplicationVersion> 
<AutoIncrementApplicationRevision>true</AutoIncrementApplicationRevision> 
<UpdateEnabled>true</UpdateEnabled> 
<UpdateInterval>2</UpdateInterval> 
<UpdateIntervalUnits>hours</UpdateIntervalUnits> 
<ProductName>xxxxxxxxxxxx</ProductName> 
<PublisherName /> 
<SupportUrl /> 
<FriendlyName>xxxxxxxxxxxx</FriendlyName> 
<OfficeApplicationDescription /> 
<LoadBehavior>3</LoadBehavior> 

+0

https://www.gnu.org/software/sed/manual/sed.html#BRE-syntax ..と残りのマニュアルを参照してください。あなたは少なくともいくつかのアイデアを得るでしょうそれを解決してください – Sundeep

+0

moreコンテキスト(周辺)行を表示 – RomanPerekhrest

+0

@RomanPerekhrestここに – Andrej

答えて

1

、その他(grepをのawk)をsedのXML/HTMLデータを解析するための良いツールになることはありません。xmlstarletのように、適切なXML/HTMLパーサを使用します。

xmlstarlet ed -L -O -u "//UpdateInterval" -v 0 foo.config 
  • ed - 編集モード

  • -Lからインプレースに

  • -Oをファイルを編集する - XML宣言を省略
  • -u - 更新アクション
  • "//UpdateInterval"
  • - XPath式
  • -v 0から

最終(典型的な)foo.configコンテンツ更新する要素の新しい値:

<root> 
    <InstallUrl/> 
    <TargetCulture>en</TargetCulture> 
    <ApplicationVersion>1.0.1.8</ApplicationVersion> 
    <AutoIncrementApplicationRevision>true</AutoIncrementApplicationRevision> 
    <UpdateEnabled>true</UpdateEnabled> 
    <UpdateInterval>0</UpdateInterval> 
    <UpdateIntervalUnits>hours</UpdateIntervalUnits> 
    <ProductName>xxxxxxxxxxxx</ProductName> 
    <PublisherName/> 
    <SupportUrl/> 
    <FriendlyName>xxxxxxxxxxxx</FriendlyName> 
    <OfficeApplicationDescription/> 
    <LoadBehavior>3</LoadBehavior> 
</root> 

<root>タグがデモンストレーション目的で指定されていた場合、xml/html構造体には独自の "root" (ほとんどの親)タグ

+0

ありがとう!!!!!!! @RomanPerekhrest – Andrej

1

を、あなたが試すことがあります。これは、の初めに<UpdateInterval>を検索します

sed -E 's/^<UpdateInterval>[0-9]+/<UpdateInterval>0/' foo.config 

^を書き留めてください)、数字([0-9]は数字を表し、繰り返しは+です1つ以上の)。このビットは<UpdateInterval>0に置き換えられます。 /文字は、検索対象とその検索対象とを区別します。 sコマンドは、検索と置き換えです。

ファイルにはfoo.configが入力され、標準出力に出力されます。あなたが同じファイルのあなたの出力をしたい場合は、行うことがあります。

sed -E 's/^<UpdateInterval>[0-9]+/<UpdateInterval>0/' foo.config >foo.temp 
mv foo.temp foo.config 

以上を単に:あなたの設定ファイルが含まれている場合、これは置換を行うための良い方法ではないことを

sed -i -E 's/^<UpdateInterval>[0-9]+/<UpdateInterval>0/' foo.config 

注意を一般 XML。 XMLビットが行の中央にある場合は、^文字を削除してください。検索と置換の式は、XMLタグの周囲に空白がないことを前提としています。

+0

一時ファイルに書き込む代わりに 'sed -i'を使いたいかもしれません。 –

+0

@glenn jackman、はい、提案に感謝します。私はそれを簡単にしようとしていましたが、 'sed -i 's/^ \ d +/ 0 /' foo.config'も完全な作業を行います。 –

+0

sedは '\ d'をサポートしていません。代わりに' [0-9] 'を使ってください。そのような' + 'を使うのに' -E'オプションが必要です – Sundeep

0

ツールを解析するXMLを使用して溶液:

{ echo '<root>'; cat foo.config; echo '</root>'; } | 
    xmlstarlet ed -O -P -u //UpdateInterval -v 0 | 
    sed '1d;$d' | 
    sponge foo.config 

最初の行は、適切なXMLファイルに設定ファイルを作ることです。
2行目で値が更新されます。
3行目はルートタグを削除します。
最後の行は、configファイルを書き換えます。 moreutilsパッケージをインストールする必要があります。

関連する問題