Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
比较linux KSH脚本中的两个字符串_Linux_Shell_Ksh_String Comparison - Fatal编程技术网

比较linux KSH脚本中的两个字符串

比较linux KSH脚本中的两个字符串,linux,shell,ksh,string-comparison,Linux,Shell,Ksh,String Comparison,我有两个文件:file1和file2。以下是文件内容的示例: <TG> <entry name="KEYNAME" val="" type="string" /> <entry name="KEYTYPE" val="" type="string" /> <entry name="TIMEZONE_OFFSET" val="-240" type="INT16" /> ... </TG> ... 我想检查fi

我有两个文件:file1和file2。以下是文件内容的示例:

<TG>
   <entry name="KEYNAME" val="" type="string" />
   <entry name="KEYTYPE" val="" type="string" />
   <entry name="TIMEZONE_OFFSET" val="-240" type="INT16" />
   ...
</TG>

...
我想检查file1中的某些行(包含字符串“entry name”)是否存在于file2中,如果存在,则比较这两行是否相同

我通过复制file1创建了file2,然后更改了一些值。问题是比较两个字符串变量不会返回正确的值。虽然在显示这两个变量时,我可以看到它们是相同的,但是比较的结果表明它们是不同的。我正在使用Ksh。这是我的密码:

while read p; do
    if [[ $p == *"entry name"* ]]; then
        PARAM_NAME=$(echo $p | cut -d '"' -f2)
        echo $PARAM_NAME
        PARAM_OLD=$(grep $PARAM_NAME file2)
        if [[ $PARAM_OLD == *"entry name"* ]]; then
            echo $PARAM_OLD
            echo $p
            if [ "$PARAM_OLD" = "$p" ]; then
                echo 'Identical values'
            else
                echo 'Different values'
            fi
        else
            echo "$PARAM_NAME does not exist in previous version file. Using default value"         
        fi
    fi
done <file1
读取p时
;做
如果[[$p==*“条目名称”*];然后
参数名称=$(回显$p |切割-d''-f2)
echo$PARAM_名称
PARAM_OLD=$(grep$PARAM_NAME file2)
如果[[$PARAM_OLD=*“条目名称”*];则
echo$PARAM_OLD
回声$p
如果[“$PARAM_OLD”=“$p”];则
回显“相同值”
其他的
回显“不同的值”
fi
其他的
echo“$PARAM_NAME在以前的版本文件中不存在。使用默认值“
fi
fi

done如果if语句中只有1=项,请将其更改为2:

if [ "$PARAM_OLD" = "$p" ]; then
致:

另外(现在不是问题,但可能是您的下一个问题),在$PARAM_OLD周围加上“在以下行中:

if [[ $PARAM_OLD == *"entry name"* ]]; then
因此,它变成:

if [[ "$PARAM_OLD" == *"entry name"* ]]; then

如果if语句中只有1=个,请将其更改为2:

if [ "$PARAM_OLD" = "$p" ]; then
致:

另外(现在不是问题,但可能是您的下一个问题),在$PARAM_OLD周围加上“在以下行中:

if [[ $PARAM_OLD == *"entry name"* ]]; then
因此,它变成:

if [[ "$PARAM_OLD" == *"entry name"* ]]; then

最新/更新的OSs支持ksh和ksh93

使用ksh93,我们可以使用关联数组将我们自己限制为通过每个文件的单个过程

首先是一些样本数据:

$ cat file1
<TG>
   <entry name="KEYNAME" val="" type="string" />
   <entry name="KEYTYPE" val="" type="string" />
   <entry name="KEYATTRIB" val="" type="string" />
   <entry name="TIMEZONE_OFFSET" val="-241" type="INT16" />
</TG>

$ cat file2
<TG>
   <entry name="KEYNAME" val="" type="string" />
   <entry name="KEYTYPE" val="" type="stringX" />
   <entry name="TIMEZONE_OFFSET" val="-240" type="INT16" />
</TG>
针对示例文件运行脚本:

$ my_comp

pname = 'KEYATTRIB' : Does not exist in file2. Using default value:
file1: <entry name="KEYATTRIB" val="" type="string" />

pname = 'KEYNAME' : Identical values for pname
file1: <entry name="KEYNAME" val="" type="string" />
file2: <entry name="KEYNAME" val="" type="string" />

pname = 'KEYTYPE' : Different values for pname
file1: <entry name="KEYTYPE" val="" type="string" />
file2: <entry name="KEYTYPE" val="" type="stringX" />

pname = 'TIMEZONE_OFFSET' : Different values for pname
file1: <entry name="TIMEZONE_OFFSET" val="-241" type="INT16" />
file2: <entry name="TIMEZONE_OFFSET" val="-240" type="INT16" />
$ my_comp2

pname = 'KEYATTRIB' : Does not exist in file2. Using default value:
file1: <entry name="KEYATTRIB" val="" type="string" />

pname = 'KEYNAME' : Identical values for pname
file1: <entry name="KEYNAME" val="" type="string" />
file2: <entry name="KEYNAME" val="" type="string" />

pname = 'KEYTYPE' : Different values for pname
file1: <entry name="KEYTYPE" val="" type="string" />
file2: <entry name="KEYTYPE" val="" type="stringX" />

pname = 'TIMEZONE_OFFSET' : Different values for pname
file1: <entry name="TIMEZONE_OFFSET" val="-241" type="INT16" />
file2: <entry name="TIMEZONE_OFFSET" val="-240" type="INT16" />
针对示例文件运行脚本:

$ my_comp

pname = 'KEYATTRIB' : Does not exist in file2. Using default value:
file1: <entry name="KEYATTRIB" val="" type="string" />

pname = 'KEYNAME' : Identical values for pname
file1: <entry name="KEYNAME" val="" type="string" />
file2: <entry name="KEYNAME" val="" type="string" />

pname = 'KEYTYPE' : Different values for pname
file1: <entry name="KEYTYPE" val="" type="string" />
file2: <entry name="KEYTYPE" val="" type="stringX" />

pname = 'TIMEZONE_OFFSET' : Different values for pname
file1: <entry name="TIMEZONE_OFFSET" val="-241" type="INT16" />
file2: <entry name="TIMEZONE_OFFSET" val="-240" type="INT16" />
$ my_comp2

pname = 'KEYATTRIB' : Does not exist in file2. Using default value:
file1: <entry name="KEYATTRIB" val="" type="string" />

pname = 'KEYNAME' : Identical values for pname
file1: <entry name="KEYNAME" val="" type="string" />
file2: <entry name="KEYNAME" val="" type="string" />

pname = 'KEYTYPE' : Different values for pname
file1: <entry name="KEYTYPE" val="" type="string" />
file2: <entry name="KEYTYPE" val="" type="stringX" />

pname = 'TIMEZONE_OFFSET' : Different values for pname
file1: <entry name="TIMEZONE_OFFSET" val="-241" type="INT16" />
file2: <entry name="TIMEZONE_OFFSET" val="-240" type="INT16" />
$my_comp2
pname='KEYATTRIB':文件2中不存在。使用默认值:
文件1:
pname='KEYNAME':pname的值相同
文件1:
文件2:
pname='KEYTYPE':pname的不同值
文件1:
文件2:
pname='TIMEZONE_OFFSET':pname的不同值
文件1:
文件2:

最新/更新的OSs同时支持ksh和ksh93

使用ksh93,我们可以使用关联数组将我们自己限制为通过每个文件的单个过程

首先是一些样本数据:

$ cat file1
<TG>
   <entry name="KEYNAME" val="" type="string" />
   <entry name="KEYTYPE" val="" type="string" />
   <entry name="KEYATTRIB" val="" type="string" />
   <entry name="TIMEZONE_OFFSET" val="-241" type="INT16" />
</TG>

$ cat file2
<TG>
   <entry name="KEYNAME" val="" type="string" />
   <entry name="KEYTYPE" val="" type="stringX" />
   <entry name="TIMEZONE_OFFSET" val="-240" type="INT16" />
</TG>
针对示例文件运行脚本:

$ my_comp

pname = 'KEYATTRIB' : Does not exist in file2. Using default value:
file1: <entry name="KEYATTRIB" val="" type="string" />

pname = 'KEYNAME' : Identical values for pname
file1: <entry name="KEYNAME" val="" type="string" />
file2: <entry name="KEYNAME" val="" type="string" />

pname = 'KEYTYPE' : Different values for pname
file1: <entry name="KEYTYPE" val="" type="string" />
file2: <entry name="KEYTYPE" val="" type="stringX" />

pname = 'TIMEZONE_OFFSET' : Different values for pname
file1: <entry name="TIMEZONE_OFFSET" val="-241" type="INT16" />
file2: <entry name="TIMEZONE_OFFSET" val="-240" type="INT16" />
$ my_comp2

pname = 'KEYATTRIB' : Does not exist in file2. Using default value:
file1: <entry name="KEYATTRIB" val="" type="string" />

pname = 'KEYNAME' : Identical values for pname
file1: <entry name="KEYNAME" val="" type="string" />
file2: <entry name="KEYNAME" val="" type="string" />

pname = 'KEYTYPE' : Different values for pname
file1: <entry name="KEYTYPE" val="" type="string" />
file2: <entry name="KEYTYPE" val="" type="stringX" />

pname = 'TIMEZONE_OFFSET' : Different values for pname
file1: <entry name="TIMEZONE_OFFSET" val="-241" type="INT16" />
file2: <entry name="TIMEZONE_OFFSET" val="-240" type="INT16" />
针对示例文件运行脚本:

$ my_comp

pname = 'KEYATTRIB' : Does not exist in file2. Using default value:
file1: <entry name="KEYATTRIB" val="" type="string" />

pname = 'KEYNAME' : Identical values for pname
file1: <entry name="KEYNAME" val="" type="string" />
file2: <entry name="KEYNAME" val="" type="string" />

pname = 'KEYTYPE' : Different values for pname
file1: <entry name="KEYTYPE" val="" type="string" />
file2: <entry name="KEYTYPE" val="" type="stringX" />

pname = 'TIMEZONE_OFFSET' : Different values for pname
file1: <entry name="TIMEZONE_OFFSET" val="-241" type="INT16" />
file2: <entry name="TIMEZONE_OFFSET" val="-240" type="INT16" />
$ my_comp2

pname = 'KEYATTRIB' : Does not exist in file2. Using default value:
file1: <entry name="KEYATTRIB" val="" type="string" />

pname = 'KEYNAME' : Identical values for pname
file1: <entry name="KEYNAME" val="" type="string" />
file2: <entry name="KEYNAME" val="" type="string" />

pname = 'KEYTYPE' : Different values for pname
file1: <entry name="KEYTYPE" val="" type="string" />
file2: <entry name="KEYTYPE" val="" type="stringX" />

pname = 'TIMEZONE_OFFSET' : Different values for pname
file1: <entry name="TIMEZONE_OFFSET" val="-241" type="INT16" />
file2: <entry name="TIMEZONE_OFFSET" val="-240" type="INT16" />
$my_comp2
pname='KEYATTRIB':文件2中不存在。使用默认值:
文件1:
pname='KEYNAME':pname的值相同
文件1:
文件2:
pname='KEYTYPE':pname的不同值
文件1:
文件2:
pname='TIMEZONE_OFFSET':pname的不同值
文件1:
文件2:
将XML转换为制表符分隔的键/值对 以下内容将转换为选项卡单独的键值形式:

xml_to_tsv() {
  xmlstarlet sel -t -m '//entry[@name]' -v ./@name -o $'\t' -v ./@value -n
}
从每一行中提取唯一的行 因此,如果要比较两个流,则以下仅会发出第一个文件特有的行:

comm -23 <(xml_to_tsv <one.xml | sort) <(xml_to_tsv <two.xml | sort)
…您可以在根本没有XMLStarlet的系统上使用以下
xml_to_tsv
实现:

xml_to_tsv() {
  xsltproc extract_entries.xslt -
}
从XML到制表符分隔键/值对的转换 以下内容将转换为选项卡单独的键值形式:

xml_to_tsv() {
  xmlstarlet sel -t -m '//entry[@name]' -v ./@name -o $'\t' -v ./@value -n
}
从每一行中提取唯一的行 因此,如果要比较两个流,则以下仅会发出第一个文件特有的行:

comm -23 <(xml_to_tsv <one.xml | sort) <(xml_to_tsv <two.xml | sort)
…您可以在根本没有XMLStarlet的系统上使用以下
xml_to_tsv
实现:

xml_to_tsv() {
  xsltproc extract_entries.xslt -
}

使用以下两个数据文件和一个转换文件:

file1.xml:


file2.xml:


transform.xslt:


然后运行
xsltproc--stringparam other file2.xml transform.xslt file1.xml
将生成:


使用以下两个数据文件和一个转换文件:

file1.xml:


file2.xml:


transform.xslt:


然后运行
xsltproc--stringparam other file2.xml transform.xslt file1.xml
将生成:



包含完整的脚本将是明智之举,我们是一群懒惰的人,喜欢复制粘贴有问题的代码并首先测试:)对于给定的文件,
条目名是否唯一,例如,
entry name=“KEYTYPE”
在文件中只显示一次?还有,哪个shell(bash、sh、ksh、ksh93)您正在使用吗?是的markp..它只显示一次..我正在使用Ksh。您是否考虑过使用支持XML的工具将内容转换为更易于处理的形式?使用
xmllint--xpath
document()
函数。包括完整的脚本将是明智之举,