如何使用shell脚本从文件中删除某些单词?

时间:2011-06-13 14:40:00

标签: linux shell sed word

我必须删除通过命令行给出的每个文件中包含至少一个数字的每个单词作为参数。这是我的代码:

while [ "$*" != "" ]; do
    if [ ! -f $1 ]
        then echo "$1 not file"
    else
        sed -ie  "s/[^ ]*[0-9][^ ]*//g" $1
    fi
    shift
done

如果我只有一个文件,它会完美运行,但是如果我有更多文件,它会为每个文件提供相同的结果。在每个文件中运行脚本后,将会有第一个脚本的结果。

有人可以告诉我我错过了什么吗?

EDIT2:

这就是我现在正在运行的:

while [ "$#" -ne 0 ]; do
for file in "$@"; do
    if [ ! -e "$file" ]; then
        printf "file doesn't exist: %s\n" "$file"
        continue;
    fi
    if [ ! -f "$file" ]; then
        printf "not a file: %s\n" "$file"
        continue;
    fi
done
    sed -i "s/[^ ]*[0-9][^ ]*//g" "$file"
done

我在谈论while循环的完成和for循环的完成;但即便没有,我的脚本也会继续运行。

编辑:

基本上同样的事情只是有点不同。我必须从每个文件的每一行中删除第二个和第四个单词(单词只包含字母数字字符)。它'工作不正常,我找不到错误。这是我的代码:

while [ "$*" != "" ]; do
    if [ ! -f $1 ]
        then echo "$1 not file"
    else
        sed -ie  's/^\( *[^ ]+\) +[^ ]+\(.*\)/\1\2/
                  s/^\( *[^ ]+\)\( +[^ ]+\) +[^ ]+\(.*\)/\1\2\3/g' $1
    fi
    shift
done

1 个答案:

答案 0 :(得分:0)

while循环条件应该检查​​是否没有参数,如果有的话应该继续。所以正确的形式是

while [ "$#" -ne 0 ]; do

现在,您真正想要的是获取每个参数并使用它做一些事情。这自动意味着 for loop 。所以你真正应该做的是

for file in $@; do

现在,一个文件中可以有空格,因此获取该文件名并检查它是否真的是一个文件应该是引用,你还应该先检查是否存在

for file in "$@"; do
    if [ ! -e "$file" ]; then
        printf "file doesn't exist: %s\n" "$file"
        continue;
    fi
    if [ ! -f "$file" ]; then
        printf "not a file: %s\n" "$file"
        continue;
    fi
    sed -i "s/[^ ]*[0-9][^ ]*//g" "$file"
done

我可以在sed上扩展更多,其中-i开关仅限于GNU sed。除此之外,您可能还想保留该文件的备份,以防出现问题 但这是我猜的另一个话题。