Командная строка bash - как преобразовать несколько строк в одну для sh -c

​​

может быть объединить find и sed?

find . -maxdepth 1 -name "*.tar*" | sed 's/\(.*\)\(\.tar.*\)/\1/g'

объяснение: {{1 }} первая часть sed

\(.*\)\(\.tar.*\)

находит tar, но обеспечивает 2 группировки. 1 до .tar и 1 после tar

вторая часть sed

\1

принимает только первую группу (до .tar)

2
28.08.2017, 03:31
3 ответа

Насколько я понимаю, у вас есть два варианта:

  1. Поместите это в файл сценария и запустите ЭТО
  2. Замените каждую новую строку в большем окне кода точкой с запятой

Я бы выбрал 1, лично.

3
27.01.2020, 21:51

Нет проблем с символами новой строки в аргументе 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"}}'
3
27.01.2020, 21:51

Чтобы преобразовать это в одну строку. Я добавил несколько ;в правильных местах:

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}для подтверждения.

2
27.01.2020, 21:51

Теги

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