Как удалить определенные слова из файлов с помощью скрипта оболочки? - PullRequest
0 голосов
/ 13 июня 2011

Я должен удалить каждое слово, содержащее хотя бы одно число из каждого файла, заданного через командную строку в качестве параметра. Это мой код:

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

Я говорил о цикле done для while и цикле done for; но даже без этого мой скрипт продолжает работать.

EDIT:

В основном одно и то же, немного другое. Я должен удалить второе и четвертое слово из каждой строки из каждого файла (слово содержит только буквенно-цифровые символы). Это не работает должным образом, и я не могу найти ошибку. Это мой код:

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 голосов
/ 13 июня 2011

условие цикла while должно проверять, нет ли аргументов, и если оно есть, оно должно продолжаться.Таким образом, правильная форма будет

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

Теперь, что вы действительно хотите, это получить каждый аргумент и что-то с ним сделать.Это автоматически подразумевает для цикла .То, что вы действительно должны делать, это:

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.Кроме того, вы можете также сохранить резервную копию этого файла на случай, если что-то пойдет не так.
Но это другая тема, я думаю.

...