使用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

嗨,我在使用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 "-------------------"
        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}'

我已经更改了语法,但是脚本没有删除任何内容。它显示了所有的内容,没有任何修改。我改变了语法,但脚本没有删除任何内容。它显示了一切