0

1) インスタンスの検索、および 2) この文字列の出力に使用できる sed スクリプトが必要です。

<bean:write name='iframesrcUrl'/> 
<bean:write name="iframesrcUrl"/>
<bean:write name="currentPage" property="title" filter="false"/>

または類似。nameproperty値が異なる場合があります。propertyおよびfilter属性はオプションです。単一引用符'と二重引用符の両方"が発生します。

sed コマンドは 2 つの頭を持つ必要があります。最初に 1 つのコマンドを実行して、何が検出されるかを確認します。次に、次のコマンドを実行して実際の置換を行います。文字列は次のものに置き換える必要があります。

${ iframesrcUrl }
${ currentPage.title }

簡単な grep は、私のプロジェクトに 68 個のオカレンスがあることを示しています。grep '<bean:write name=' **/* |wc -l

これを解決する最も簡単な方法は何ですか?

4

4 に答える 4

0

ここであなたのgrep正規表現を削除します

1)見つけたものを印刷する

sed '/<bean:write name=/!d'

2)見つかったものを交換します

sed '/<bean:write name=/s/^.*$/${ iframesrcUrl }\n${ currentPage.title }/'

あなたの質問をさらに見ると、グロブスターがオンになっているBash4があるように見えます(** / *グロブのため)。これらのsedスクリプトを各ファイルで再帰的に実行する場合は、次のことをお勧めします。

#!/bin/bash

for file in **/*; do
    <sed one-liner here> "$file"
done

置換sedスクリプトの場合は、追加-iするだけでインプレース編集を実行できます。これが機能するにはGNUSedが必要であることに注意してください。GNU sedがない場合は、出力を一時ファイルにリダイレクトする必要があります。

于 2009-12-22T09:29:30.493 に答える
0

次のようなファイルがあると仮定します

<root>
<bean:write name='iframesrcUrl'/> 
<bean:write name="iframesrcUrl"/>
<bean:write name="currentPage" property="title" filter="false"/>
<foo><bar/></foo>
</root>

このコマンドで置換を行うことができますsed(GNU sed を使用):

 sed "s/<bean:write name=[\'\"]\?iframesrcUrl[\'\"]\?\/>/\${ iframesrcUrl }/g; \
      s/<bean:write name=[\'\"]\?currentPage[\'\"]\?.*\/>/\${ currentPage.title }/g;" \
     input.xml

これは以下を生成します:

<root>
${ iframesrcUrl } 
${ iframesrcUrl }
${ currentPage.title }
<foo><bar/></foo>
</root>

それはあなたが必要とするものですか?または、属性の値を置き換えますか? または、置換テキストをこれらのタグに挿入しますか?

すべてのファイルをその場で見つけて編集するには (注意! ファイルを変更します。-i使用前にテストせずに、'*.jsp' の代わりにファイル マスクを入れてください):

find . -type f -name '*.jsp' -print0 | xargs -0 sed -i "..."

アップデート

ファイル自体の行ではなく、属性値を置き換えるには、 /xmlstarletの代わりに使用することを強くお勧めします。はるかに信頼性が高く、柔軟性があります。処理するには完全な(有効な)ファイルが必要なため、あなたのケースに正確にソリューションを投稿することはできませんが、これはアイデアです:sedawkxmlstarlet

与えられたファイル:

<a>
   <b>
      <c name="foo"/>
      <c name="bar"/>
   </b>
</a>

とで置き換えたいfooとしましょう。次に、このコマンドでそれを実行します(読みやすくするために行を分割しています):SPAMbarEGGS

$ printf '<a><b><c name="foo"/><c name="bar"/></b></a>' | \
  xmlstarlet ed --update "//c[@name='foo']/@name" -v SPAM \
                --update "//c[@name='bar']/@name" -v EGGS
<?xml version="1.0"?>
<a>
  <b>
    <c name="SPAM"/>
    <c name="EGGS"/>
  </b>
</a>

XPath 構文を使用して、置き換える要素を選択しました (最初のケースではname、任意のタグに属し、にc等しい属性ですfoo)。edのサブコマンドはxmlstarletさまざまな変換を可能にし、要素の置換 (更新) はその 1 つです。

実際の例ではbean、ワークスペースも指定する必要があります。つまり、次のようなものを追加します

 -N bean=urn:...

xmlstarletのオプションのリストに。.jsp ファイルの最初の行で正しい URI を見つけることができます (調べる必要はありません)。

于 2009-12-22T13:02:17.640 に答える
0

出力がどうなるかは正確にはわかりません。より明確なサンプルの入力と出力を提供するまで、単なる推測です

awk '/bean:write name/{
    $0="${ iframesrcUrl }\n${ currentPage.title }"
}{print}' file
于 2009-12-22T10:04:31.587 に答える