Используя функции обработки строк, мы могли бы сделать это с помощью Perl следующим образом:
printf '%s\n' "$STRING" |
perl -nse '
$_.= join "", <>;
$k++ while ++($p = index($_, $s, $p));
print $k, "\n" ;
' -- -s="$SUB_STRING"
Пояснение:
° load up the whole string in $_
° index function will return the position of a substring in a string OTW returns -1
° progressively match the substring and use the position found as the starting position for the next search.
° all this while increment the counter $k depicting substring found.
Некоторые другие методы перечислены ниже:
Удалите строку и используйте регулярное выражение.
printf '%s\n' "$STRING" |
perl -slp -0777e '
$_ = () = /$s/g;
' -- -s="$s"
° Вставить строку в переменную $ _.
° передать подстроку из командной строки в perl с помощью опции -s.
° Теперь выполните сопоставление с $ _и в контексте списка получите совпадения, которые затем будут взяты в скалярном контексте для получения количества совпадений.
° опция -p автоматически печатает содержимое $ _.
Метод с использованием инструмента sed:
esc_s=$(printf '%s\n' "$SUB_STRING" |\
sed -e 's:[][\/.^$*]:\\&:g' -e 'H;1h;$!d;g;s/\n/\\n/g')
printf '%s\n' "$STRING" |
sed -ne '
$!{N;s/^/\n/;D;}
/'"$esc_s"'/{
x;p;x
s///;s/^/\n/;D
}
' | wc -l
° В качестве подготовительного шага мы идем дальше и экранируем все символы, действующие как метасимволы, в левую часть оператора s/// в подстроке, что, если не сделать, приведет к сбою sed.
° Теперь мы вливаем всю строку в пространство шаблонов.
° затем мы продолжаем печатать пустую строку, место хранения является хорошим кандидатом, и удаляем подстроку из пространства шаблона.
° промыть... вспенить... повторять до тех пор, пока присутствует подстрока.
° Затем пустые строки передаются в инструмент wc, который дает нам количество строк = количество найденных подстрок.
Это версия оболочки:
e=$STRING N=0
while
e=$(expr " $e" : " \(.*\)$SUB_STRING")
case $e in "" ) break ;; esac
do
N=$(expr "$N" + 1)
done
echo "$N"
Чего вы пытаетесь достичь?
Для сценария bash ! инвертирует выходной сигнал. Если вы хотите увидеть пример в CLI, запустите:
ls ; echo $?
должен вернуть 0
! ls ; echo $?
вернет 1. Посмотрите внимательно в нижней части возврата, если ваша папка заполнена. Вы получите 0 или 1 в зависимости от того, как вы его запустите.
В вашем примере ! находится рядом с if (без пробела )Как !if, не ! if, и он инвертирует if в fi, а затем bash говорит, что fi не является командой. Попробуйте с пробелом между ! а если и посмотреть что будет. Не уверен, что вам нужно, чтобы произошло. Как я уже сказал, объясните желаемые результаты, и это поможет кому-то получить ваш ответ.
Экраны оболочки обычно требуют ввода команды оболочки. все в одну строку. Попробуйте ввести
!if [[ ! -s /directory1/subdirectory1/file1.txt ]]; then mv /directory1/subdirectory1/file1.txt /directory2/subdirectory2; fi
(Вам не нужна точка с запятой в конце.)
Если вы собираетесь выполнять одну и ту же команду много раз, вы можете упростить себе жизнь, поместив ее в (локальный )сценарий оболочки. Затем вы можете запустить его, набрав
!my_conditional_mv
(или как вы это называете ).