使用猫通配符打印强制换行


9

我想在bash中使用带有通配符的cat以便将多个小文件(每个文件是一个句子)打印到标准输出。但是,单独的文件内容不是用换行符分隔的,为了方便阅读,我希望这样做。

如何在此命令中添加某种文件分隔符?

Answers:


12

定义一个shell函数,该函数在每个文件之后输出行尾,并使用它代替cat

endlcat() {
  for file in "$@"; do
    cat -- "$file"
    echo
  done
}

然后您可以使用endlcat *

for循环遍历所有提供的参数($@),它是由外壳,当您使用通配符像已逃走*。该--要求不上的划线开头的文件名呛。最后,echo输出换行符。


在事后看来使用迭代似乎很明显!我以为猫里可能有个旗帜,但这也可以!谢谢。
lennyklb

您不需要in "$@"-它是隐式的。
l0b0

4
明确表示有利于提高可读性。
cas 2015年

5

只需使用循环而不是简单的cat

for file in /path/to/targetdir/*; do
    echo "-------- $file -------"
    cat "$file" 
done

就像接受的答案一样工作,但是其中一个也可以进入命令行的下一步,因此我接受了另一个。
lennyklb 2015年

3

如果要在文件之间使用文件名,请使用tail

tail -n +1 ./*

(如果您要tac代替cat,则某些tail实现可以-r选择等效tac功能)


3

这将起作用:

sed '' -- *

您不需要任何shell循环,否则,它将始终在带有\n尾线的文件输出之后-也许最后一个除外。

否则,如果您希望在每个文件的输出之间输出空白行,则可以这样做:

bpaste(){
    eval "paste -'sd\n' -- $(x=0;for f do printf "\"\${$((x+=1))}\" - ";done)"
}   </dev/null

这将始终在文件的输出之后加上\n粗线附加的空白行。

您可以这样称呼它:

bpaste *

@cuonglm-操作员希望在文件之间使用换行符。这样可以确保文件之间的换行。
mikeserv

@cuonglm-您应该再试一次。for n in 1 2 3; do printf "$n" >"$n"; done; sed '' -- [123]
mikeserv

@cuonglm-任何人都sed必须\n在打印其他任何东西之前总是先打印ewline,但是最后一个文件的最后一行可能不会\n附加ewline。我可以发誓我已经回答了这个问题。
mikeserv

@cuonglm-我不明白你的意思。壳牌的点点我只是给你打印1\n2\n3。有用。它总是如此。它为您打印什么?
mikeserv

1
@DennisWilliamson:\n在RHS中使用不是标准的。您可以使用sed -e '$G'
cuonglm

2

@terdon的答案类似,如果您碰巧以后也希望看到文件名,则可以使用以下head命令:

$ head *file*
==> file_1 <==
file 1 content

==> file_2 <==
file 2 content

==> file_3 <==
file 3 content

head默认情况下为前10行,因此在不使用命令选项的情况下使用它(每个文件一个句子)就可以了。否则,您需要该-n X选项。


2

另一种方法-用于grep -h简单地在每个文件中搜索空字符串。这将匹配所有行,无论有多少行或是否以换行符终止。grep结果始终以换行符结尾。该-h选项禁止在输出的每一行前添加来自其的文件名:

$ printf 'a' > a
$ printf 'b\nB' > b
$ printf 'c\n' > c
$ ls
a  b  c
$ cat -- *
ab
Bc
$ grep -h '' *
a
b
B
c
$ 

或者,您可以paste-sEerial模式下以换行符作为分隔符来使用GNU :

$ paste -s -d '\n' -- *
a
b
B
c
$ 
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.