19. 仅 Gnu Sed 支持的替换标志
GNU
版本的 sed 中可用。 它们可以用在 sed 的replacement-string
部分。
替换标志
\l
标志
当您在replacement-string
部分中指定\l
时,它将把紧跟在\l
后面的字符视为小写。
您已经知道以下简单示例会将 "John"
更改为 "JOHNNY"
。
sed 's/John/JOHNNY/' employee.txt
以下示例在replacement-string
中的 H
之前包含\l
(即 JO\lHNNY
)。 这只会将 JOHNNY
中的字符 h
更改为小写。
更改 "John"
为 "JOhNNY"
:
$ sed -n 's/John/JO\lHNNY/p' employee.txt
101,JOhNNY Doe,CEO
\L
标志
当您在replacement-string
部分中指定\L
时,它将其余字符视为小写。
以下示例在replacement-string
中的 H
之前包含\L
(即JO\lHNNY
)。 这会将其余字符从 h
开始之后都更改为小写。
更改 "Johnny"
为 "JOhnny"
:
$ sed -n 's/John/JO\LHNNY/p' employee.txt
101,JOhnny Doe,CEO
\u
标志
与\l
类似,但为大写。 当您在replacement-string
部分中指定\l
时,它会立即处理该字符。
\u
后面为大写。 以下示例在replacement-string
中的 h
之前包含\u
(即 jo\uhnny
)。
这只会将 johnny
中的字符 h
更改为大写。
更改 "John"
为 "joHnny"
:
$ sed -n 's/John/jo\uhnny/p' employee.txt
101,joHnny Doe,CEO
\U
标志
当您在replacement-string
中指定\U
时,它将其余字符视为大写。
以下示例在替换字符串中的 h
之前包含\U
(即jo\Uhnny
)。
这会将 johnny
中的 h
的其余字符更改为大写。
更改 "John"
为 "joHNNY"
:
$ sed -n 's/John/jo\Uhnny/p' employee.txt
101,joHNNY Doe,CEO
\E
标志
应该与\L
或\U
结合使用。 这将停止由\L
或\U
启动的转换。
以下示例以大写形式打印整个替换字符串 "Johnny Boy"
,因为replacement-string
的开头有\U
。
更改 "John"
为 "JOHNNY BOY"
:
$ sed -n 's/John/\UJohnny Boy/p' employee.txt
101,JOHNNY BOY Doe,CEO
更改 "John"
为 "JOHNNY Boy"
:
$ sed -n 's/John/\UJohnny\E Boy/p' employee.txt
101,JOHNNY Boy Doe,CEO
上面的示例仅以大写形式打印 "Johnny"
,因为replacement-string
中"Johnny"
后面紧接着有 \E
。
与分组结合的实用范例
上述静态示例只是为了了解这些可选标志的工作原理。与静态值一起使用时,这些标志没有太多价值,因为您本可以只需在所需的确切情况下键入想要的静态值即可。
与分组结合使用时,这些标志非常有用。在前面的示例中,我们学习了如何使用分组交换 字段 1
与 字段 3
。
您可以使用这些标志将整个分组转换为大写或小写。
员工姓名全部大写,职务全部小写:
$ sed 's/\([^,]*\),\([^,]*\),\(.*\).*/\U\2\E,\1,\L\3/g' employee.txt
JOHN DOE,101,ceo
JASON SMITH,102,it manager
RAJ REDDY,103,sysadmin
ANAND RAM,104,developer
JANE MILLER,105,sales manager
在上面的示例中,replacement-string
有以下内容:
\U\2\E
- 这表明该字段是第二组(员工姓名),应转换为大写。\U
启动大写转换,\E
停止它。\L\3
- 这表示该字段是第三组(标题),应转换为小写。从\L
开始往后的字符的转换为小写。