我正在尝试流程替换,这只是一个有趣的练习。
我想将字符串“XXX”附加到“ls”的所有值:
paste -d ' ' <(ls -1) <(echo "XXX")
这怎么行不通?不附加 XXX。但是,如果我想将文件名附加到自身,例如
paste -d ' ' <(ls -1) <(ls -1)
有用。
我不明白这种行为。echo 和 ls -1 都写入标准输出,但粘贴不读取 echo 的输出。
尝试这样做,使用printf
hack 来显示具有零长度输出和附加 XXX 的文件。
paste -d ' ' <(ls -1) <(printf "%.0sXXX\n" * )
演示:
$ ls -1
filename1
filename10
filename2
filename3
filename4
filename5
filename6
filename7
filename8
filename9
输出 :
filename1 XXX
filename10 XXX
filename2 XXX
filename3 XXX
filename4 XXX
filename5 XXX
filename6 XXX
filename7 XXX
filename8 XXX
filename9 XXX
如果你只想附加 XXX,这个会更简单:
printf "%sXXX\n"
这里有一个有趣的,除了传说中的命令,没有使用任何外部yes
命令!
while read -u 4 head && read -u 5 tail ; do echo "$head $tail"; done 4< <(ls -1) 5< <(yes XXX)
(我发布这个只是因为它很有趣,而且它实际上不是 100% 偏离主题,因为它使用文件描述符和进程替换)
... 你必须:
for i in $( ls -1 ); do echo "$i XXXX"; done
永远不要使用for i in $(command)
. 有关更多详细信息,请参阅此答案。
所以,要回答这个原始问题,你可以简单地使用这样的东西:
for file in *; do echo "$file XXXX"; done
awk 的另一个解决方案:
ls -1|awk '{print $0" XXXX"}'
awk '{print $0" XXXX"}' <(ls -1) # with process substitution
sed 的另一个解决方案:
ls -1|sed "s/\(.*\)/\1 XXXX/g"
sed "s/\(.*\)/\1 XXXX/g" <(ls -1) # with process substitution
和无用的解决方案,只是为了好玩:
while read; do echo "$REPLY XXXX"; done <<< "$(ls -1)"
ls -1|while read; do echo "$REPLY XXXX"; done
如果你想要XXX
在每一行ls -l
输出之后,你需要第二个命令输出 x 倍的字符串。您只回显一次,因此它只会附加到ls
输出的第一行。
如果您正在寻找一个小命令行来完成您可能使用的任务sed
:
ls -l | sed -n 's/\(^.*\)$/\1 XXX/p'
您可以使用 xargs 获得相同的效果:
ls -1 | xargs -I{} echo {} XXX
它只对第一行执行此操作,因为它将参数 1 的第一行与参数 2 的第一行分组:
paste -d ' ' <(ls -1) <(echo "XXX")
...输出:
/dir/file-a XXXX
/dir/file-b
/dir/file-c
... 你必须:
for i in $( ls -1 ); do echo "$i XXXX"; done