Bash: Как применить две строковые операции в одной строке? - PullRequest
6 голосов
/ 01 февраля 2012

Я хотел бы сразу изменить путь и расширение файла в переменной, например, сделайте следующее

for F in $( find /foo/bar -name "*.ext" ); do 
  Ftmp=${F%.ext}
  cp $F ${Ftmp//bar/b0r}.tmp 
done

без временной переменной

Можно ли применять две строковые операции одновременно только с помощью bash?

Ответы [ 4 ]

8 голосов
/ 09 июля 2012

Использовать Bash временную переменную

$_    Temporary variable; initialized to pathname of script or program
      being executed. Later, stores the last argument of previous command.
      Also stores name of matching MAIL file during mail checks.
for F in $( find /foo/bar -name "*.ext" )
do
  : ${F%.ext}
  cp $F ${_//bar/b0r}.tmp
done
2 голосов
/ 01 февраля 2012

Ну, вы можете сделать это как без временной переменной:

for F in $( find /foo/bar -name "*.ext" ); do 
     cp $F "$(sed 's/\.[^.]\+$/.tmp/;s/bar/b0r/' <<< $F)" 
done

Но это два новых процесса.С простым расширением переменных, я думаю, вам нужна эта переменная.

Редактировать : благодаря @ glenn jackman теперь это еще один дополнительный процесс.

Edit2 : bash только с одной переменной вида:

for F in $( find /foo/bar -name "*.ext" ); do 
     F=${F/.ext/}
     cp ${F}.ext ${F/bar/b0r}.tmp
done
1 голос
/ 03 февраля 2012

Ответ №

Вы говорите о расширении параметра .

Все они принимают форму ${parameter..., а параметром является "имя, число или один из специальных символов, перечисленных ниже ..." , поэтому параметр не должен сам являться выражением .

0 голосов
/ 01 февраля 2012

Это может работать для вас:

for F in $( find /foo/bar -name "*.ext" | sed 's/\.ext$//'); do 
     cp ${F}.ext ${F//bar/b0r}.tmp
done
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...