比较linux KSH脚本中的两个字符串
我有两个文件:file1和file2。以下是文件内容的示例:比较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
<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()
函数。包括完整的脚本将是明智之举,