Bash同时循环sed替换
我这里有个奇怪的问题。我想我99%在那里。在尝试执行以下操作时,我只是在某个地方出现了一个小的语法和/或逻辑错误: 所以我有一个清单文件,里面有一堆MD5和。别担心,这些金额只是为了比较,不是为了安全。该文件如下所示:Bash同时循环sed替换,bash,sed,while-loop,Bash,Sed,While Loop,我这里有个奇怪的问题。我想我99%在那里。在尝试执行以下操作时,我只是在某个地方出现了一个小的语法和/或逻辑错误: 所以我有一个清单文件,里面有一堆MD5和。别担心,这些金额只是为了比较,不是为了安全。该文件如下所示: puppy.cfg=324327437483274834783204723 kitty.cfg=7893703274r0327403247032472 etc. function MANIFEST.CHECK { local IDA="$1" local SUMA=$(
puppy.cfg=324327437483274834783204723
kitty.cfg=7893703274r0327403247032472
etc.
function MANIFEST.CHECK {
local IDA="$1"
local SUMA=$(md5sum $1 | cut -d ' ' -f 1)
while read LINE; do
local IDB="`echo $LINE | cut -d"=" -f1`";
local SUMB="`echo $LINE | cut -d"=" -f2`";
if [ "$IDA" = "$IDB" ]; then
if [ ! "$SUMA" = "$SUMB" ]; then
sed -i "s%$SUMB%$SUMA%" var/manifest
echo "The file is/was different."
return
fi
fi
done < <(grep -v '#' var/manifest)
}
manifest=var/manifest
function MANIFEST.CHECK {
local IDA="$1"
local SUMA=$(md5sum "$1" | cut -d' ' -f1)
local IDB SUMB
while read LINE; do
IFS== read IDB SUMB <<< "$LINE"
if [ "$IDA" = "$IDB" ]; then
if [ "$SUMA" != "$SUMB" ]; then
sed -i "s%$SUMB%$SUMA%" "$manifest"
echo "The file is/was different."
break
fi
fi
done < <(grep -v '#' "$manifest")
}
MANIFEST.CHECK puppy.cfg
调用“Manifest”函数并传递一个值。它会被传递一个称为ID(IDA)的文件名。然后,该函数计算该文件的当前和(IDA)。然后它查看清单文件中的每一行,直到找到匹配的文件ID(IDA=IDB)。当它找到匹配的ID时,会将当前总和与清单文件中的总和进行比较(SUMA vs SUMB)。如果没有区别,那么函数只是关闭,什么也不做。如果检测到差异,则函数“应”使用“当前”总和更新清单文件。此部分功能当前不起作用。它做了一些奇怪的事情,把变量混合在一起,什么都没有改变。我知道我错过了一些简单的事情。有人能帮忙吗
function MANIFEST.CHECK {
local IDA="$1"
local SUMA=$(md5sum $1 | cut -d ' ' -f 1)
while read LINE; do
local IDB="`echo $LINE | cut -d"=" -f1`";
local SUMB="`echo $LINE | cut -d"=" -f2`";
if [ "$IDA" = "$IDB" ]; then
if [ ! "$SUMA" = "$SUMB" ]; then
while read LINE; do
sed "s%$SUMB%$IDA\=$SUMA%" var/manifest
done < <(grep -v '#' var/manifest)
echo "The file is/was different."
return
fi
fi
done < <(grep -v '#' var/manifest)
}
### START SCRIPT ###
MANIFEST.CHECK puppy.cfg
函数清单.CHECK{
本地IDA=“$1”
本地SUMA=$(md5sum$1 |切割-d'-f 1)
边读边做
本地IDB=“`echo$LINE | cut-d”=”-f1`”;
本地SUMB=“`echo$LINE | cut-d”=“-f2`”;
如果[“$IDA”=“$IDB”];则
如果[!“$SUMA”=“$SUMB”];则
边读边做
sed“s%$SUMB%$IDA\=$SUMA%”变量/清单
完成<如果我理解正确,那么您可以将内部while
循环替换为单个sed
,如下所示:
puppy.cfg=324327437483274834783204723
kitty.cfg=7893703274r0327403247032472
etc.
function MANIFEST.CHECK {
local IDA="$1"
local SUMA=$(md5sum $1 | cut -d ' ' -f 1)
while read LINE; do
local IDB="`echo $LINE | cut -d"=" -f1`";
local SUMB="`echo $LINE | cut -d"=" -f2`";
if [ "$IDA" = "$IDB" ]; then
if [ ! "$SUMA" = "$SUMB" ]; then
sed -i "s%$SUMB%$SUMA%" var/manifest
echo "The file is/was different."
return
fi
fi
done < <(grep -v '#' var/manifest)
}
manifest=var/manifest
function MANIFEST.CHECK {
local IDA="$1"
local SUMA=$(md5sum "$1" | cut -d' ' -f1)
local IDB SUMB
while read LINE; do
IFS== read IDB SUMB <<< "$LINE"
if [ "$IDA" = "$IDB" ]; then
if [ "$SUMA" != "$SUMB" ]; then
sed -i "s%$SUMB%$SUMA%" "$manifest"
echo "The file is/was different."
break
fi
fi
done < <(grep -v '#' "$manifest")
}
MANIFEST.CHECK puppy.cfg
函数清单.CHECK{
本地IDA=“$1”
本地SUMA=$(md5sum$1 |切割-d'-f 1)
边读边做
本地IDB=“`echo$LINE | cut-d”=”-f1`”;
本地SUMB=“`echo$LINE | cut-d”=“-f2`”;
如果[“$IDA”=“$IDB”];则
如果[!“$SUMA”=“$SUMB”];则
sed-i“s%$SUMB%$SUMA%”变量/清单
echo“文件不同。”
返回
fi
fi
完成<刚刚检查,您是否希望sed“就地”更改文件(如编辑器)?它没有;它只是将修改后的副本发送到stdout。这解释了为什么我看到了“mashed”输出。嗯,我不知道从这里开始该怎么做。您建议如何替换文件中的一行。