Bash
GNU sed:在名稱開始前和名稱結束後附加(輸出為:“$ ls -xN”)
請有人檢查我的 GNU
sed
腳本是否是這樣做的好方法,或者它是否是某種壞/錯誤的 hack:p$ ls -xN 1 2 3 4
$ ls -xN | sed -E "s/(.{1})$/\1\.log/" | sed -E "s/^(.{1})/Day\ \1/" Day 1.log Day 2.log Day 3.log Day 4.log
我不明白為什麼
sed
不辨識\n
(換行)和\s
(空白):
新隊:
- 我想使用
\n
,但我必須.{1}$
改用空白:
- 我想使用
\s
,但我必須\
改用
GNU
sed
辨識\n
和\s
。但是,\s
表示“任何空白字元”,它至少匹配一個空格、換行符(也稱為換行符)、製表符、換頁符、垂直製表符和輸入符,但在您的語言環境中可能更多。它相當於標準[[:space:]]
字元類。由於它不是一個字元而是多個字元,因此它不能用於替換運算符的右側,因為它不明確並且sed
不知道您要插入什麼。它在左側工作正常:$ printf '[space]: [tab]:\t[CR]:\r[FF]\f\n' [FF]ce]: [tab]: [CR]: $ printf '[space]: [tab]:\t[CR]:\r[FF]\f\n' | sed 's/\s/MATCH/g' [space]:MATCH[tab]:MATCH[CR]:MATCH[FF]MATCH $
此外,您可以使用簡單的空格,無需轉義:
$ printf '%s\n' {1..4} | sed -E 's/^(.{1})/Day \1/' Day 1 Day 2 Day 3 Day 4
接下來,GNU
sed
可以很好地辨識換行符,我只是不明白它們在這裡是如何相關的。意思是“$
匹配行尾”。如果需要,您可以將其替換為 a\n
。例如:$ printf '%s\n' {1..4} | sed -zE 's/(.)\n/\1.log\n/g' 1.log 2.log 3.log 4.log
它似乎與您問題中的使用者案例無關。最後,您可以在一次操作中完成整個操作:
$ printf '%s\n' {1..4} | sed -E 's/(.)/Day \1.log/' Day 1.log Day 2.log Day 3.log Day 4.log
最後一點,解析的輸出幾乎從來都不是一個好主意
ls
,因為它會破壞甚至稍微奇怪的文件名。在您提到的特定情況下並不真正相關,但一般情況下您應該避免它。