bash:进程替换、粘贴和回显

bash:进程替换、粘贴和回显,bash,unix,stdout,Bash,Unix,Stdout,我正在尝试过程替换,这只是一个有趣的练习 我想将字符串“XXX”附加到“ls”的所有值上: paste -d ' ' <(ls -1) <(echo "XXX") paste-d'如果您想在每行ls-l输出之后使用XXX,则需要第二个命令,该命令输出字符串的x倍。您只回显了一次,因此它将仅附加到ls输出的第一行 如果要搜索一个小命令行来完成任务,可以使用sed: ls -l | sed -n 's/\(^.*\)$/\1 XXX/p' 如果要在每行ls-l输出之后使用XXX,则需

我正在尝试过程替换,这只是一个有趣的练习

我想将字符串“XXX”附加到“ls”的所有值上:

paste -d ' ' <(ls -1) <(echo "XXX")

paste-d'如果您想在每行
ls-l
输出之后使用
XXX
,则需要第二个命令,该命令输出字符串的x倍。您只回显了一次,因此它将仅附加到
ls
输出的第一行

如果要搜索一个小命令行来完成任务,可以使用
sed

ls -l | sed -n 's/\(^.*\)$/\1 XXX/p'

如果要在每行
ls-l
输出之后使用
XXX
,则需要第二个命令,该命令输出字符串的x倍。您只回显了一次,因此它将仅附加到
ls
输出的第一行

如果要搜索一个小命令行来完成任务,可以使用
sed

ls -l | sed -n 's/\(^.*\)$/\1 XXX/p'

它仅对第一行执行此操作,因为它将参数1中的第一行与参数2中的第一行分组:

paste -d ' ' <(ls -1) <(echo "XXX")
。。。你必须:

for i in $( ls -1 ); do echo "$i XXXX"; done
for i in $( ls -1 ); do echo "$i XXXX"; done

它仅对第一行执行此操作,因为它将参数1中的第一行与参数2中的第一行分组:

paste -d ' ' <(ls -1) <(echo "XXX")
。。。你必须:

for i in $( ls -1 ); do echo "$i XXXX"; done
for i in $( ls -1 ); do echo "$i XXXX"; done

尝试这样做,使用
printf
hack显示长度为零的输出并附加XXX的文件

paste -d ' ' <(ls -1) <(printf "%.0sXXX\n" *  )
输出:

filename1 XXX
filename10 XXX
filename2 XXX
filename3 XXX
filename4 XXX
filename5 XXX
filename6 XXX
filename7 XXX
filename8 XXX
filename9 XXX
如果您只想附加XXX,那么这个将更简单:

printf "%sXXX\n" 

尝试这样做,使用
printf
hack显示长度为零的输出并附加XXX的文件

paste -d ' ' <(ls -1) <(printf "%.0sXXX\n" *  )
输出:

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)

读取-u4头和读取-u5尾时;做回显“$head$tail”;完成4,这里有一个有趣的例子,除了传奇的
yes
命令外,没有使用任何外部命令

while read -u 4 head && read -u 5 tail ; do echo "$head $tail"; done 4< <(ls -1) 5< <(yes XXX)

读取-u4头和读取-u5尾时;做回显“$head$tail”;完成4<您可以使用xargs实现相同的效果:

ls -1 | xargs -I{} echo {} XXX

可以使用xargs获得相同的效果:

ls -1 | xargs -I{} echo {} XXX
。。。你必须:

for i in $( ls -1 ); do echo "$i XXXX"; done
for i in $( ls -1 ); do echo "$i XXXX"; done
切勿对$中的i使用
(命令)
。有关更多详细信息,请参阅

所以,要回答这个原始问题,您可以简单地使用以下内容:

for file in *; do echo "$file XXXX"; done
awk的另一个解决方案:

ls -1|awk '{print $0" XXXX"}'
awk '{print $0" XXXX"}' <(ls -1) # with process substitution
ls-1 | awk'{print$0“XXXX”}
awk'{print$0“XXXX”}
。。。你必须:

for i in $( ls -1 ); do echo "$i XXXX"; done
for i in $( ls -1 ); do echo "$i XXXX"; done
切勿对$中的i使用
(命令)
。有关更多详细信息,请参阅

所以,要回答这个原始问题,您可以简单地使用以下内容:

for file in *; do echo "$file XXXX"; done
awk的另一个解决方案:

ls -1|awk '{print $0" XXXX"}'
awk '{print $0" XXXX"}' <(ls -1) # with process substitution
ls-1 | awk'{print$0“XXXX”}

awk“{print$0“XXXX”}”如果要使用粘贴,则需要一个包含初始化为“XXX”的元素的数组,因为您列出的目录中存在文件。我认为在我上面的回答中使用for迭代要简单得多(甚至有些人可能会说不那么优雅)。千万不要在$(command)中使用
for I
查看此答案以了解更多详细信息:如果要使用粘贴,您将需要一个初始化为“XXX”的元素数组,因为您列出的目录中存在文件。我认为在我上面的答案中使用for迭代要简单得多(甚至有些人可能会说不那么优雅)。千万不要在$(command)中使用
for I
查看此答案了解更多详细信息:
echo
只生成一行
paste
需要为
ls
echo
生成的每一行使用一个字符串,只生成一行<代码>粘贴
需要为
ls
生成的每一行使用一个字符串。