printf在空间上制作新线

时间:2016-11-23 14:35:36

标签: bash shell printf

我有以下printf代码,每次命中我的文件中的空格时都会添加换行符。如何阻止它添加此换行符。

文件列表:

<td><%= post.category.categoryname if post.category_id? %></td>

代码:

mytest
mytest stuff
new test things

输出:

for i in `find / -iname *test*`; do
  printf $i'\n'; done

我试图去除空格,并在每个文件后面添加换行符:

/var/private/mytest
/var/private/mytest
stuff
/var/private/new
test
things

3 个答案:

答案 0 :(得分:3)

find此处仅用于实现您可以在纯bash中执行的操作(假设版本4或更高版本):

shopt -s nocaseglob globstar nullglob
for i in /**/*test*; do
    path=${i%/*}
    base=${i#$path/}
    printf '%s\n' "$path" "${base// /}"
done

答案 1 :(得分:1)

此处的问题与printf没有任何关系,与for i in `find / -iname *test*`无关。

使用不带引号的命令替换时,其输出将经历两个步骤:

  • 字段拆分(根据IFS中的字符将输出分为多个单词 - 默认情况下,空格,制表符和换行符)
  • Glob扩展(其中每个单词都被评估为glob)。

这意味着如果您使用命令touch 'my * test'创建了文件,那么$i将随后扩展为my;然后将每个单独的文件称为*,然后发送到test

如果你想在bash中安全地迭代find的结果,并为每个名称生成一个无空格的版本,那么这样做如下所示:

while IFS= read -r -d '' i; do
  printf '%s -> %s\n' "$i" "${i//[[:space:]]/}"
done < <(find / -iname '*test*' -print0)

将发出如下内容:

/var/private/mytest -> /var/private/mytest
/var/private/mytest stuff -> /var/private/myteststuff
/var/private/new test things -> /var/private/newtestthings

答案 2 :(得分:0)

ls=$(find . -iname '*test*' | sed 's/ //g')
for i in ${ls} 
do
  echo "$i" 
done

测试

./mytest
./myteststuff
./newtestthings