1

私はプロセス置換を試していますが、これはただの楽しい練習です。

文字列「XXX」を「ls」のすべての値に追加したい:

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

これが機能しないのはなぜですか?XXX は付加されません。ただし、次のようにファイル名をそれ自体に追加したい場合

paste -d ' ' <(ls -1) <(ls -1)

できます。

挙動がわかりません。echo と ls -1 の両方が stdout に書き込みますが、echo の出力は貼り付けによって読み取られません。

4

6 に答える 6

4

printfハックを使用して、長さゼロの出力と 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" 
于 2013-10-28T18:54:36.823 に答える
1

伝説のコマンド以外の外部コマンドを使用していない面白いものがありyesます!

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

(これは面白いから投稿しているだけで、ファイル記述子とプロセス置換を使用しているため、実際にはトピックから 100% 外れているわけではありません)

于 2013-10-28T19:20:45.970 に答える
1

XXX出力のすべての行の後に必要ls -lな場合は、文字列の x 倍を出力する 2 番目のコマンドが必要です。一度だけエコーしているため、ls出力の最初の行にのみ追加されます。

タスクを達成するための小さなコマンドラインを探している場合は、次を使用できますsed

ls -l | sed -n 's/\(^.*\)$/\1 XXX/p'
于 2013-10-28T18:51:13.313 に答える
1

... 必ず:

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
于 2013-10-28T20:44:24.730 に答える
0

これは、パラメーター 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
于 2013-10-28T18:54:10.687 に答える