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开始往后的字符的转换为小写。