使用shell脚本从文件中删除特定单词
嗨,我在使用Shell脚本从文件中删除一组特定的单词时遇到问题。我的问题来了,使用shell脚本从文件中删除特定单词,shell,Shell,嗨,我在使用Shell脚本从文件中删除一组特定的单词时遇到问题。我的问题来了, 我的文件:group.dat 采样线 管理 管理 管理员 我的脚本:groupdel.sh #!/bin/sh groupf="<pathtofile>/group.dat" tmp="<pathtofile>/te" delgrp() { echo "Enter the group to be deleted" read gname echo
我的文件:group.dat
采样线
管理
管理
管理员
我的脚本:groupdel.sh
#!/bin/sh
groupf="<pathtofile>/group.dat"
tmp="<pathtofile>/te"
delgrp()
{
echo "Enter the group to be deleted"
read gname
echo "-------------------"
for gn in `cat $groupf`
do
if [ "$gname" = "$gn" ]
then
sed -e "s/$gname//g" $groupf > $tmp&&mv $tmp $groupf
echo "deleted group"
cat $groupf
exit 1
fi
done
}
echo "Welcome to Group delete wizard"
delgrp
#/垃圾箱/垃圾箱
groupf=“/group.dat”
tmp=“/te”
delgrp()
{
echo“输入要删除的组”
阅读格南
回音“------------”
对于'cat$groupf'中的gn`
做
如果[“$gname”=“$gn”]
然后
sed-e“s/$gname//g”$groupf>$tmp&&mv$tmp$groupf
回显“已删除组”
类别$groupf
出口1
fi
完成
}
echo“欢迎使用组删除向导”
德尔格普
输出:
输入要删除的组
管理
删除组
裂痕
除颤器
问题:我的问题是我不希望脚本删除ADMINISTRATION或ADMINISTRATOR,但只删除ADMIN,以及如何实现它的任何帮助。提前感谢如果单词的开头和结尾正确分开,您可以使用
\W
来表示单词的开头和结尾:
sed -e "s/\(\W\)$gname\(\W\)/\1\2/g" $groupf > $tmp&&mv $tmp $groupf
如果单词的开头和结尾正确分开,可以使用
\W
来表示它们:
sed -e "s/\(\W\)$gname\(\W\)/\1\2/g" $groupf > $tmp&&mv $tmp $groupf
为什么不使用sed
sed 's/^word$//g'
还可以使用正则表达式指定多个单词
sed 's/word1|word2//g'
我没试过,但这正是你需要的。只要看看互联网上的sed语法就知道了
关于为什么不使用sed
sed 's/^word$//g'
还可以使用正则表达式指定多个单词
sed 's/word1|word2//g'
我没试过,但这正是你需要的。只要看看互联网上的sed语法就知道了
关于如果文件是每行一个组,并且组名是行上唯一的内容,请在正则表达式中使用锚:
s/^$gname:.*//g
如果您安装了Perl,您可能可以通过以下方式将其简化:
if grep -q "^${gname}:" $groupf ; then
perl -ni -e "print unless /^${gname}:/" $groupf
echo "Group deleted."
else
echo "No such group $gname."
fi
甚至
grep -v "^${gname}:" $groupf > $tmp && \
cp -f $tmp $groupf && rm -f $tmp
它会将除匹配行之外的所有行复制到临时文件,然后将临时文件复制到原始文件上,并替换它
请注意,我建议使用cp
而不是mv
来保留原始文件的权限mv
将导致编辑的文件具有根据您的umask设置的权限,而不考虑原始权限
因此,对于完整的脚本:
#!/bin/sh
groupf="<pathtofile>/group.dat"
tmp="<pathtofile>/te"
delgrp()
{
echo -n "Enter the group to be deleted: "
read gname
echo "-------------------"
if grep -q "^${gname}:" $groupf ; then
grep -v "^${gname}:" $groupf > $tmp
cp -f $tmp $groupf
rm -f $tmp
else
echo "No such group '$gname'"
fi
}
echo "Welcome to Group delete wizard"
delgrp
#/垃圾箱/垃圾箱
groupf=“/group.dat”
tmp=“/te”
delgrp()
{
echo-n“输入要删除的组:”
阅读格南
回音“------------”
如果grep-q“^${gname}:$groupf;那么
grep-v“^${gname}:$groupf>$tmp
cp-f$tmp$groupf
rm-f$tmp
其他的
echo“没有这样的组“$gname”
fi
}
echo“欢迎使用组删除向导”
德尔格普
这应该可以可靠地工作。如果文件是每行一个组,并且组名是行上唯一的内容,请在正则表达式中使用锚:
s/^$gname:.*//g
#!/bin/sh
groupf="<pathtofile>/group.dat"
tmp="<pathtofile>/te"
delgrp()
{
echo "Enter the group to be deleted"
read gname
echo "-------------------"
sed -e "/^$gname[[:blank:]]/d" "$groupf" > "$tmp" && mv "$tmp" "$groupf"
echo "deleted group $gname"
cat "$groupf"
return 0
}
echo "Welcome to Group delete wizard"
delgrp
如果您安装了Perl,您可能可以通过以下方式将其简化:
if grep -q "^${gname}:" $groupf ; then
perl -ni -e "print unless /^${gname}:/" $groupf
echo "Group deleted."
else
echo "No such group $gname."
fi
甚至
grep -v "^${gname}:" $groupf > $tmp && \
cp -f $tmp $groupf && rm -f $tmp
它会将除匹配行之外的所有行复制到临时文件,然后将临时文件复制到原始文件上,并替换它
请注意,我建议使用cp
而不是mv
来保留原始文件的权限mv
将导致编辑的文件具有根据您的umask设置的权限,而不考虑原始权限
因此,对于完整的脚本:
#!/bin/sh
groupf="<pathtofile>/group.dat"
tmp="<pathtofile>/te"
delgrp()
{
echo -n "Enter the group to be deleted: "
read gname
echo "-------------------"
if grep -q "^${gname}:" $groupf ; then
grep -v "^${gname}:" $groupf > $tmp
cp -f $tmp $groupf
rm -f $tmp
else
echo "No such group '$gname'"
fi
}
echo "Welcome to Group delete wizard"
delgrp
#/垃圾箱/垃圾箱
groupf=“/group.dat”
tmp=“/te”
delgrp()
{
echo-n“输入要删除的组:”
阅读格南
回音“------------”
如果grep-q“^${gname}:$groupf;那么
grep-v“^${gname}:$groupf>$tmp
cp-f$tmp$groupf
rm-f$tmp
其他的
echo“没有这样的组“$gname”
fi
}
echo“欢迎使用组删除向导”
德尔格普
这应该工作可靠。#/垃圾箱/垃圾箱
#!/bin/sh
groupf="<pathtofile>/group.dat"
tmp="<pathtofile>/te"
delgrp()
{
echo "Enter the group to be deleted"
read gname
echo "-------------------"
sed -e "/^$gname[[:blank:]]/d" "$groupf" > "$tmp" && mv "$tmp" "$groupf"
echo "deleted group $gname"
cat "$groupf"
return 0
}
echo "Welcome to Group delete wizard"
delgrp
groupf=“/group.dat”
tmp=“/te”
delgrp()
{
echo“输入要删除的组”
阅读格南
回音“------------”
sed-e“/^$gname[:blank:][]/d“$groupf”>“$tmp”和&mv“$tmp”$groupf”
echo“已删除组$gname”
类别“$groupf”
返回0
}
echo“欢迎使用组删除向导”
德尔格普
假设组名位于行的开头,并且行上还有其他内容,并且您希望删除整行,请使用正则表达式和命令,如图所示
不需要循环,因为sed
将免费迭代文件的行
您应该从函数中返回
,而不是从函数中退出
。零意味着成功。一个表示错误或失败
始终引用包含文件名的变量名。#/垃圾箱/垃圾箱
groupf=“/group.dat”
tmp=“/te”
delgrp()
{
echo“输入要删除的组”
阅读格南
回音“------------”
sed-e“/^$gname[:blank:][]/d“$groupf”>“$tmp”和&mv“$tmp”$groupf”
echo“已删除组$gname”
类别“$groupf”
返回0
}
echo“欢迎使用组删除向导”
德尔格普
假设组名位于行的开头,并且行上还有其他内容,并且您希望删除整行,请使用正则表达式和命令,如图所示
不需要循环,因为sed
将免费迭代文件的行
您应该从函数中返回
,而不是从函数中退出
。零意味着成功。一个表示错误或失败
始终引用包含文件名的变量名。Awk是sed的可读替代品:
awk -v to_delete="$gname" -F: '$1 == to_delete {next} {print}'
Awk是sed的可读替代品:
awk -v to_delete="$gname" -F: '$1 == to_delete {next} {print}'
我已经更改了语法,但是脚本没有删除任何内容。它显示了所有的内容,没有任何修改。我改变了语法,但脚本没有删除任何内容。它显示了一切