GNU sed:在名称开始之前和名称结束之后附加(输出为:“$ ls -xN”)

GNU sed:在名称开始之前和名称结束之后附加(输出为:“$ ls -xN”)

请有人检查一下我的 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,但我必须\使用

答案1

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可以很好地识别换行符,我只是不明白它们在这里有何相关性。意思$是“匹配行尾”。\n如果需要,您可以将其替换为 a 。例如:

$ 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

最后一点是几乎从来都不是一个好主意解析lsas 的输出,即使是稍微奇怪的文件名也会中断。与您提到的具体情况无关,但一般情况下您应该避免使用它。

相关内容