请有人检查一下我的 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
最后一点是几乎从来都不是一个好主意解析ls
as 的输出,即使是稍微奇怪的文件名也会中断。与您提到的具体情况无关,但一般情况下您应该避免使用它。