2

コマンドのGNUバージョンを使用してファイル間の差分を見つけるスクリプトを書いていますdiff。ここでは、html コメント <!-- と、一致するすべてのパターン (ファイルを介して入力として提供される) を無視する必要があります。

ファイルwxy/a:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:p="http://www.springframework.org/schema/p"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">
some text here
           <property name="loginUrl" value="http://localhost:15040/ab/ssoLogin"/>
     <!--property name="cUrl" value="http://localhost:15040/ab/ssoLogin" /-->
</beans>

ファイルxyz/a:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:p="http://www.springframework.org/schema/p"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">
some text there
           <property name="loginUrl" value="http://localhost:15045/ab/ssoLogin"/>
     <!--property name="cUrl" value="http://localhost:15045/ab/ssoLogin" /-->
</beans>

パターン入力ファイル: input.conf:

[a]
http://.*[:0-9]*/ab/ssoLogin
[some other file]
....
....

私のスクリプトは、ファイル名 [a] の input.conf を読み取り、一時ファイル lines_to_ignore に置きます。今度は、ファイル lines_to_ignore を読み取り、以下のような変数にパターンを追加します。

compare_file.sh

diff_ignore_options="-I \"\!--\"" # Ignore option for <!-- Comments

for iline in `cat lines_to_ignore`; do
    diff_ignore_options=${diff_ignore_options}" -I \"$iline\""
    echo "-----------------------------------------------------------"
    diff -I "\!--" -I "$iline" wxy/a xyz/a
    echo "-----------------------------------------------------------"
done

diff $diff_ignore_options wxy/a xyz/a 

出力は次のとおりです。

-----------------------------------------------------------
19c19
< some text here
---
> some text there
-----------------------------------------------------------

19,21c19,21
< some text here
<            <property name="loginUrl" value="http://localhost:15040/ab/ssoLogin"/>
<      <!--property name="cUrl" value="http://localhost:15040/ab/ssoLogin" /-->
---
> some text there
>            <property name="loginUrl" value="http://localhost:15045/ab/ssoLogin"/>
>      <!--property name="cUrl" value="http://localhost:15045/ab/ssoLogin" /-->

diff コマンドの変数置換が機能しないのはなぜですか?

diff $diff_ignore_options wxy/a xyz/a

一部のファイルでは複数のパターンに一致させる必要がある場合があるため、変数の方法で実行したいと考えています。

4

1 に答える 1

3

問題は!、シェルが履歴拡張に使用する文字です。さらに、エスケープされた二重引用符を$diff_ignore_options変数に含めています。無視したいパターンには"文字が含まれていないため、それは望ましくありません。

!これは機能するはずです(メタキャラクターとして扱われないように単一引用符を使用することに注意してください):

diff_ignore_options='-I !--'
diff $diff_ignore_options this_file that_file

そして、次のようなパターンをさらに追加できます。

diff_ignore_options="$diff_ignore_options -I foobar"
于 2012-08-09T19:57:08.263 に答える