Что-то продолжает выкидывать вывод в новую строку - PullRequest
0 голосов
/ 09 марта 2020
for f in *.*
do
echo -n | ls $f | rev | sed 's/^[^.]*//g'| sed 's/^.//' | rev
echo -n " ima koncnico "
echo -n | ls $f | rev | cut -d . -f1 | rev
done

У меня есть следующий код, который должен отображаться в одной строке для каждой итерации для l oop. Как выглядит мой вывод:

examples
 ima koncnico desktop
naloga_2
 ima koncnico sh
naloga_6
 ima koncnico sh
NALOGE
 ima koncnico zip
UVOS.tar
 ima koncnico xz

Как он должен выглядеть:

examples ima koncnico desktop
naloga_2 ima koncnico sh
naloga_6 ima koncnico sh
NALOGE ima koncnico zip
UVOS.tar ima koncnico xz

Почему это происходит? Я предполагаю, что это как-то связано с ls. Какое лучшее решение?

Ответы [ 2 ]

4 голосов
/ 09 марта 2020

Просто используйте расширения параметров; вам не нужен этот конвейер, и он в любом случае не делает то, о чем вы думаете.

for f in *.*; do
    printf '%s ima koncnico %s\n' "${f%.*}" "${f##*.}"
done
1 голос
/ 09 марта 2020

О вашей проблеме:

echo -n | something в большинстве случаев не поможет. Он ничего не выводит и не передает ничего в другое.

Ваше решение - echo -n $(something), потому что оно запускает something, а затем выводит этот вывод без завершающего символа новой строки .

for f in *.*
do
  echo -n $(ls $f | rev | sed 's/^[^.]*//g'| sed 's/^.//' | rev)
  echo -n " ima koncnico "
  ls $f | rev | cut -d . -f1 | rev
done

Я полностью удалил последний echo, так как вам все равно нужна новая строка, в противном случае все файлы - это одна строка.

Способ написать это, возможно, более четко это будет выглядеть так:

for f in *.*
do
  NAME=$(ls $f | rev | sed 's/^[^.]*//g'| sed 's/^.//' | rev)
  EXT=$(ls $f | rev | cut -d . -f1 | rev)
  echo "$NAME ima koncnico $EXT"
done

О лучшем методе в целом:

Весь конвейер на самом деле не нужен - есть более простые способы. Как отметил пользователь oguz ismail в своем ответе, вы можете использовать расширение параметра .

...