может быть объединить find и sed?
find . -maxdepth 1 -name "*.tar*" | sed 's/\(.*\)\(\.tar.*\)/\1/g'
объяснение: {{1 }} первая часть sed
\(.*\)\(\.tar.*\)
находит tar, но обеспечивает 2 группировки. 1 до .tar и 1 после tar
вторая часть sed
\1
принимает только первую группу (до .tar)
Насколько я понимаю, у вас есть два варианта:
Я бы выбрал 1, лично.
Нет проблем с символами новой строки в аргументе sh -c
. {1..10}
- это синтаксис zsh
(теперь поддерживается несколькими другими оболочками), а не sh
. Если ваш sh
выводит что-либо, кроме {1..20}
после echo {1..20}
, то это нарушение соответствия POSIX, и вы должны быть готовы чтобы это было исправлено в новых версиях. Вы можете использовать:
zsh -c '
for i in {1..10}
do
for j in {1..10}
do
echo "test inner"
done
echo "test outer"
done'
Или
sh -c '
i=1; while [ "$i" -le 10 ]
do
j=1; while [ "$j" -le 10 ]
do
echo "test inner"
j=$((j + 1))
done
echo "test outer"
i=$((i + 1))
done'
Но глупо запускать для этого 100 echo
команд, в то время как вы можете сделать это всего одной командой:
awk 'BEGIN{
for (i=1; i<=10; i++) {
for (j=1; j<=10; j++)
print "test inner"
print "test outer"
}}'
Которую вы можете поместить в одну строку, если вы хотите с помощью:
awk 'BEGIN{for(i=1;i<=10;i++){for(j=1;j<=10;j++)print"test inner";print"test outer"}}'
Чтобы преобразовать это в одну строку. Я добавил несколько ;
в правильных местах:
for i in {1..10}; do for j in {1..10}; do echo "test inner ${j}"; done; echo "test outer ${i}"; done;
Вышеупомянутая строка будет работать с bash
, но чтобы запустить это с sh -c
, вам нужно расширить {1..10}
(, насколько я знаю ), потому что sh
не поддерживает синтаксис этого диапазона. В этом случае у меня работает следующая строка:
sh -c 'for i in 1 2 3 4 5 6 7 8 9 10; do for j in 1 2 3 4 5 6 7 8 9 10; do echo "test inner ${j}"; done; echo "test outer ${i}"; done;'
Примечание :Я добавил ${j}
и ${i}
для подтверждения.