Bash

GNU sed:在名稱開始前和名稱結束後附加(輸出為:“$ ls -xN”)

  • August 22, 2022

請有人檢查我的 GNUsed腳本是否是這樣做的好方法,或者它是否是某種壞/錯誤的 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,但我必須\ 改用

GNUsed辨識\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

接下來,GNUsed可以很好地辨識換行符,我只是不明白它們在這裡是如何相關的。意思是“$匹配行尾”。如果需要,您可以將其替換為 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,因為它會破壞甚至稍微奇怪的文件名。在您提到的特定情況下並不真正相關,但一般情況下您應該避免它。

引用自:https://unix.stackexchange.com/questions/714458