Острота Perl для задания:
perl -nle 'print s/(^|[^,]),,([^,]|$)/$&/g' your_file
Или, еще короче, с awk
:
awk -F',,' '{print NF-1}' your_file
awk
можно было бы рассмотреть ,,,,
быть двумя случаями ,,
, в то время как perl
нельзя было бы считать его вообще. Выберите тот, который удовлетворяет Вашему варианту использования.
Обновление
Из Вашего комментария кажется, что Ваше исходное намерение состояло в том, чтобы считать количество пустых полей на каждой строке. Если это так, эта острота Perl должна помочь (она предполагает, что нет никаких заключенных в кавычки полей, содержащих запятые):
perl -nle 'print scalar grep {//} split/,/' your_file
То же в awk
если Perl не доступен:
awk -F, 'empty=0;{for(i=1;i<=NF;i++)if($i=="")empty++};{print empty}' your_file
Если нет расширения в файлах Имя:
for i in secondfolder/IM_* ; do mv "$i" "${i%_[0-9]*}_$[10#${i##*_}+2048]" ; done
Простой способ в Bash
:
for i in $(ls /path/to/your-directory); do
name=$(echo "$i" | cut -d '_' -f1)
num=$(echo "$i" | cut -d'_' -f2)
num1=$(( num + 2048 ))
mv "$i" "${name}_$num1"
done
Здесь мы должны передать имя файла дважды в функции.
Это не совсем то же самое, что вы заметили, заметив, что один из них используется в качестве значения argv [0]
. Это не обязательно должно совпадать с базовым именем исполняемого файла; многие/большинство вещей игнорируют это, и вы можете поместить туда все, что хотите.
Первый - это фактический путь к исполняемому файлу, для которого существует очевидная необходимость. Второй передается процессу якобы в качестве имени, используемого для его вызова, но, например,
execl("/bin/ls", "banana", "-l", NULL);
Будет работать нормально, предполагая, что /bin/ls
является правильным путем.
Однако в некоторых приложениях используется argv [0]
. Обычно они имеют одну или несколько символьных ссылок в $ PATH
; это характерно для утилит сжатия (иногда вместо них используются оболочки). Если установлен xz
, stat $ (который xzcat)
показывает, что это ссылка на xz
, и man xzcat
совпадает с man xz
, что объясняет «xzcat эквивалентен xz --decompress --stdout». Способ xz может сказать, как он был вызван, проверяя argv [0]
, делая следующие эквиваленты:
execl("/bin/xz", "xzcat", "somefile.xz", NULL);
execl("/bin/xz", "xz", "--decompress", "--stdout", "somefile.xz", NULL);
-121--39912- Вы можете использовать копию bash...
Я имею в виду, что вы можете сделать отдельную версию bash в одном из ваших каталогов $ PATH
, и назвать его bash1 или что-то вроде того.
Тогда, что вы можете сделать, это дать ему другие разрешения, чтобы вы могли запустить glassfish с bash1 вместо bash.
Это означает, что tyat bash останется неизменным, и у вас будет собственная версия bash с отдельными разрешениями для экземпляров, таких как glassfish . Единственный недостаток в том, что это будет означать, что вам придется регулировать это только для определенных программ и пользователей или вся система может быть подорвана...
Здесь основной способ сделать что-то подобное с помощью сценария оболочки и awk.
Этот пример сценария является достаточно явным для вашего конкретного случая, его использование второго поля в имени файла является допустимым целым числом. И надеется, что в именах файлов нет случайных подчеркиваний. Более общий сценарий подтверждает, что поле 2 является просто числами, и делает разделитель полей параметром. Также предполагается, что нет расширения файла (например, .img или .png)
#!/bin/sh WORKDIR=/(Directory where the files to be renamed are) NUM2ADD=2048 cd $WORKDIR echo "Old File New File" ls IM_* | while read i do newfile=`echo $i | awk -F_ -v incby=$NUM2ADD '{t=$2 + incby;printf "IM_%s",t;}'` echo $i $newfile # after a dry run to test, replace 'echo' with 'mv' onces your sure of the result. done
Поскольку наличие расширения файла вполне вероятно, можно изменить строку awk на:
newfile=`echo $i | awk -F[_.] -v incby=$NUM2ADD '{t=$2 + incby; printf "IM_%s.%s",t,$3;}'`
Это сохраняет расширение файла и использует _ подчеркивания и точку в качестве разделителей полей.