Что не так с этим вызовом к sed-i?

test -n на первый взгляд уродливо, с тех пор -n требует аргумента. Я полагаю, что некоторые исторические реализации рассматривали его как синтаксическую ошибку (и возвратил ненулевое состояние). Однако во всех оболочках Вы, вероятно, встретитесь в 21-м веке, поведение четко определено (POSIX, следуя существующей практике): если test имеет только один аргумент, затем это верно, если и только если тот аргумент непуст.

Обратите внимание, что при игнорировании кавычек тест может закончить тем, что был ложью для некоторых непустых значений $VAR. Это может даже распечатать сообщение об ошибке, если существуют globbing символы в $VAR.

VAR='foo -a -z bar'; test -n $VAR || echo "true... and false is false"
VAR='= n-'; test -n $VAR || echo "this is an equality test"
VAR='*'; test -n $VAR || echo "you may or may not see this depending on what files are in the current directory"

test -z $VAR так же повреждается.

Ksh, удар и zsh имеют a [[ … ]] условная конструкция, которая подражает традиционному test и [ утилиты. В отличие от этого, [, который или является внешней утилитой или является встроенным, которое анализируется как один, [[ … ]] часть синтаксиса оболочки. Нет никакого разделения слова или globbing внутри [[ … ]]. [[ -n $VAR ]] прекрасен (как долго, поскольку Вы не заботитесь, что Ваши сценарии не будут работать под другими оболочками, такими как пепел).

2
08.01.2013, 01:05
2 ответа

Самое легкое решение состоит в том, чтобы использовать это:

find . -type f \( ! -name '*.plist' \) -and \( ! -name '*.mp4' \) -and \( ! -name '.DS*' \) -print0 | xargs -0 perl -pi -w -e  's/AAA/BBB/g'
1
27.01.2020, 22:14

В отличие от GNU sed, sed, который поставлется с MAC OSX, требует аргумента -i опция, указывая резервный суффикс; для подавления резервного копирования, необходимо передать пустую строку (''). Поэтому sed интерпретировал Ваш s/AAA/BBB/ как резервный суффикс и взятие Вашего имени файла кулака (./myDir/pro ...) как команда для выполнения. Конечно, . не допустимая команда sed, вызывая ошибку. Имея это в виду, следующее будет работать:

find [...] | xargs -0 sed -i.bak 's/AAA/BBB/g'

Или, если Вы настаиваете на том, чтобы подавлять резервное копирование

find [...] | xargs -0 sed -i '' 's/AAA/BBB/g'
1
27.01.2020, 22:14

Теги

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