новичок sed: изменение всех случаев в папке

Вы можете «обрезать» текст, то есть удалить все пробелы в начале и конце. Если все, что осталось, это пустая строка, то вводится только пробел (или ничего).

NSString *rawString = [textField text];
NSCharacterSet *whitespace = [NSCharacterSet whitespaceAndNewlineCharacterSet];
NSString *trimmed = [rawString stringByTrimmingCharactersInSet:whitespace];
if ([trimmed length] == 0) {
    // Text was empty or only whitespace.
}

Если вы хотите проверить, есть ли какие-либо пробелы (где-либо в тексте), вы можете сделать это следующим образом:

NSRange range = [rawString rangeOfCharacterFromSet:whitespace];
if (range.location != NSNotFound) {
    // There is whitespace.
}

Если вы хотите запретить пользователю вводить пробелы в все, см. решение @ Hanon.

78
задан Chris Farmer 25 May 2009 в 03:16
поделиться

4 ответа

Невозможно сделать это, используя только sed. Вам нужно будет одновременно использовать как минимум утилиту find:

find . -type f -exec sed -i.bak "s/foo/bar/g" {} \;

Эта команда создаст файл .bak для каждого измененного файла.

Примечания:

  • -i [ Аргумент 1115645] для команды sed является расширением GNU, поэтому, если вы запускаете эту команду с BSD sed , вам нужно будет перенаправить вывод в новый файл, а затем переименовать его.
  • Утилита find не реализует аргумент -exec в старых модулях UNIX, поэтому вам нужно будет использовать | xargs вместо этого.
118
ответ дан 24 November 2019 в 10:33
поделиться

Что касается переносимости, я не полагаюсь на особенности sed, специфичные для Linux или BSD. Вместо этого я использую сценарий перезаписи из книги Кернигана и Пайка о среде программирования Unix.

Затем команда

find /the/folder -type f -exec overwrite '{}' sed 's/old/new/g' {} ';'

И сценарий перезаписи (который я использую во всем place) is

#!/bin/sh
# overwrite:  copy standard input to output after EOF
# (final version)

# set -x

case $# in
0|1)        echo 'Usage: overwrite file cmd [args]' 1>&2; exit 2
esac

file=$1; shift
new=/tmp/$$.new; old=/tmp/$$.old
trap 'rm -f $new; exit 1' 1 2 15    # clean up files

if "$@" >$new               # collect input
then
    cp $file $old   # save original file
    trap 'trap "" 1 2 15; cp $old $file     # ignore signals
          rm -f $new $old; exit 1' 1 2 15   # during restore
    cp $new $file
else
    echo "overwrite: $1 failed, $file unchanged" 1>&2
    exit 1
fi
rm -f $new $old

Идея состоит в том, что он перезаписывает файл только в случае успешного выполнения команды. Полезно в find , а также там, где вы не хотели бы использовать

sed 's/old/new/g' file > file  # THIS CODE DOES NOT WORK

, потому что оболочка усекает файл до того, как sed сможет его прочитать.

6
ответ дан 24 November 2019 в 10:33
поделиться

Могу я предложить (после резервного копирования ваших файлов):

find /the/folder -type f -exec sed -ibak 's/old/new/g' {} ';'
2
ответ дан 24 November 2019 в 10:33
поделиться
-3
ответ дан 24 November 2019 в 10:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: