首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >一些东西不断地将输出抛到新行中。

一些东西不断地将输出抛到新行中。
EN

Stack Overflow用户
提问于 2020-03-08 23:41:03
回答 2查看 36关注 0票数 0
代码语言:javascript
复制
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

我有下面的代码,对于for循环的每一次迭代都应该在同一行中回显。我的输出是什么样子的:

代码语言:javascript
复制
examples
 ima koncnico desktop
naloga_2
 ima koncnico sh
naloga_6
 ima koncnico sh
NALOGE
 ima koncnico zip
UVOS.tar
 ima koncnico xz

它应该是什么样子:

代码语言:javascript
复制
examples ima koncnico desktop
naloga_2 ima koncnico sh
naloga_6 ima koncnico sh
NALOGE ima koncnico zip
UVOS.tar ima koncnico xz

为什么会发生这种情况?我想是和ls有关吧。什么是最好的解决方案?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-03-08 23:54:53

关于你手头问题的

在大多数情况下,echo -n | something不会做任何有用的事情。它什么也不输出,什么也不输出。

您的解决方案是echo -n $(something),因为它运行something,然后输出不带尾换行符的输出。

代码语言:javascript
复制
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,因为您无论如何都需要一个换行符,否则所有文件都是一行。

用一种也许更清晰的方式写这篇文章的方法是:

代码语言:javascript
复制
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在他们的回答中提到的,you can use parameter expansion

票数 1
EN

Stack Overflow用户

发布于 2020-03-08 23:53:50

只需使用参数扩展;您不需要该管道,它也不会执行您认为它可以做的事情。

代码语言:javascript
复制
for f in *.*; do
    printf '%s ima koncnico %s\n' "${f%.*}" "${f##*.}"
done
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60593119

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档