- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有两个文件: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
我尝试了括号、等号和引号的所有可能性([]、[[]]、=、==、""、'""' 等)
这是我得到的输出:
<entry name="KEYNAME" val="" type="string" />
KEYNAME
<entry name="KEYNAME" val="" type="string" />
<entry name="KEYNAME" val="" type="string" />
Different values
<entry name="KEYTYPE" val="" type="string" />
KEYTYPE
<entry name="KEYTYPE" val="" type="string" />
<entry name="KEYTYPE" val="" type="string" />
Different values
<entry name="TIMEZONE_OFFSET" val="-24" type="INT16" />
TIMEZONE_OFFSET
<entry name="TIMEZONE_OFFSET" val="-240" type="INT16" />
<entry name="TIMEZONE_OFFSET" val="-24" type="INT16" />
Different values
我仍然发现字符串不同!我将不胜感激任何解释和帮助。
最佳答案
最新/较新的操作系统都支持 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>
ksh93 脚本:
$ cat my_comp
#!/bin/ksh93
unset pline
typeset -A pline
# pull unique list of 'entry name' lines from file2 and store in our associative array pline[]:
egrep "entry name" file2 | sort -u | while read line
do
# strip out the 'entry name' value
x=${line#*\"}
pname=${x%%\"*}
# use the 'entry name' value as the index for our pline[] array
pline[${pname}]=${line}
done
# for each unique 'entry name' line in file1, see if we have a match in file2 (aka our pline[] array):
egrep "entry name" file1 | sort -u | while read line
do
# again, strip out the 'entry name' value
x=${line#*\"}
pname=${x%%\"*}
# if pname does not exist in file2
[ "${pline[${pname}]}" = '' ] && \
echo "\npname = '${pname}' : Does not exist in file2. Using default value:" && \
echo "file1: ${line}" && \
continue
# if pname exists in file2 but line is different
[ "${pline[${pname}]}" = "${line}" ] && \
echo "\npname = '${pname}' : Identical values for pname" && \
echo "file1: ${line}" && \
echo "file2: ${pline[${pname}]}" && \
continue
# if pname exists in file2 and line is the same
[ "${pline[${pname}]}" != "${line}" ] && \
echo "\npname = '${pname}' : Different values for pname" && \
echo "file1: ${line}" && \
echo "file2: ${pline[${pname}]}"
done
针对示例文件运行脚本:
$ 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" />
回到普通的基本 ksh:
$ cat my_comp2
#!/bin/ksh
egrep "entry name" file1 | sort -u | while read line1
do
x=${line1#*\"}
pname=${x%%\"*}
# see if we can find a matching line in file2; need to strip off leading
# spaces in order to match with line1
unset line2
line2=$( egrep "entry name.*${pname}" file2 | sed 's/^ *//g' )
# if pname does not exist in file2
[ "${line2}" = '' ] && \
echo "\npname = '${pname}' : Does not exist in file2. Using default value:" && \
echo "file1: ${line1}" && \
continue
# if pname exists in file2 but lines are different
[ "${line2}" = "${line1}" ] && \
echo "\npname = '${pname}' : Identical values for pname" && \
echo "file1: ${line1}" && \
echo "file2: ${line2}" && \
continue
# if pname exists in file2 and lines are the same
[ "${line2}" != "${line1}" ] && \
echo "\npname = '${pname}' : Different values for pname" && \
echo "file1: ${line1}" && \
echo "file2: ${line2}"
done
针对示例文件运行脚本:
$ 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" />
关于linux - 比较linux KSH脚本中的两个字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45694193/
我想知道为什么下面的小脚本现在可以工作。 我在/data 目录下创建了 dfFile 但脚本没有打印 if 语句中的表达式。 #!/bin/ksh DATAFILE="/data/dfFile" ec
这个问题不太可能帮助任何 future 的访问者;它只与一个小的地理区域、一个特定的时间点或一个非常狭窄的情况有关,这些情况并不普遍适用于互联网的全局受众。为了帮助使这个问题更广泛地适用,visit
我正在编写一个简单的 ksh 脚本。我必须检查字符串是否为空。怎么做呢?这就是我所拥有的: findRes=`find . -name believe | xargs grep -q "ser"` i
首先介绍一点背景知识:我们有 9 个 JVM 服务器,它们输出日志文件,我不断地解析这些日志文件以查找何时发生错误。日志每 5-10 分钟滚动一次,但文件名不会更改。我使用 SupperPutty 打
当脚本由 ksh 提供时,它如何确定它的路径? IE。 $ ksh ". foo.sh" 我已经在 stackoverflow 和其他地方发布的 BASH 中看到了非常好的方法,但还没有找到 ksh
我在某处读到 ksh 的数组支持 += 来追加新元素,但我试过了,它不起作用: [ksh] # arr=(a b c d) [ksh] # arr+=e [ksh] # echo ${arr[*]}
在我的 ksh 脚本中,我有参数 VERSION=3.9.2X。 $VERSION 始终以 3.9.2 开头,X 可以是任何整数或 float 。 以下不规则 ksh 语法适用于任何 X 整数,但不适
我参与了将包含数百个 ksh 脚本的系统从 AIX、Solaris 和 HPUX 移植到 Linux 的过程。我发现 ksh 在两个系统上的行为方式存在以下差异: #!/bin/ksh flag=fa
我正在编写一个 Expect 脚本并且在处理 shell 提示时遇到了麻烦(在 Linux 上)。我的 Expect 脚本生成 rlogin并且远程系统正在使用 ksh .远程系统上的提示包含当前目录
我讨厌 eval... 我被这个 ksh 困住了,它必须是这样的。 我需要这个函数,它将接收一个变量名和一个值。将对该变量的内容和值做一些事情,然后必须更新接收到的变量。排序: REPORT="a t
我希望我的 ksh 脚本具有不同的行为,具体取决于是否有通过 stdin 传入的内容: (1) cat file.txt | ./script.ksh (then do "cat ./tmp
set -o vi-tabcomplete正在打开选项卡自动完成 和 set -o emacs正在打开历史记录(上一个命令向上,下一个命令向下) 但是,如果我同时在 ~/.kshrc 中设置,它只会打
#!/bin/ksh ######################### for i in {1..30} ;do echo $i done 输出是: {1..30} 我的代码有什么问题
我编写了一个示例 KornShell 函数来拆分字符串,将其放入数组中,然后打印出值。 代码如下 #!/usr/bin/ksh splitString() { string="abc@hotm
我需要检查变量是否具有以指定子字符串开头的字符串值。 在 Python 中,它会是这样的: foo = 'abcdef' if foo.startswith('abc'): print 'Su
我正在尝试在 ksh 中构建一种属性集。 我认为最简单的方法是使用数组,但语法太让我难受了。 我想要的是 在配置文件中构建具有名称和属性的任意大小的数组。 迭代该列表中的每个项目并获取该属性。 我理论
我正在尝试在 ksh 中构建一种属性集。 我认为最简单的方法是使用数组,但语法太让我难受了。 我想要的是 在配置文件中构建具有名称和属性的任意大小的数组。 迭代该列表中的每个项目并获取该属性。 我理论
我需要知道执行赋值的命令的退出状态。 export VALUE=`My_Get_Value 10` 我需要知道 My_Get_Value 脚本的退出状态。 在$?中,我拥有分配本身的状态。 我在 KS
我使用内置的“getopts”ksh 来处理命令行选项,我正在寻找一种干净/标准的方法来“取消设置”命令行上的选项。我不知道这是关于 getopts 的技术问题还是更多的风格/标准问题。无论如何,我知
在 ksh 中,如下所示 iname=FA USER_FA=xyz USER_CS=test TDUSER=USER_$iname ${!TDUSER} ${!TDUSER} 未按预期工作。为什么?
我是一名优秀的程序员,十分优秀!