19. 仅 Gnu Sed 支持的替换标志


注意:这些标志仅在 GNU 版本的 sed 中可用。 它们可以用在 sed 的replacement-string部分。

当您在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

当您在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

\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

当您在replacement-string中指定\U时,它将其余字符视为大写。 以下示例在替换字符串中的 h 之前包含\U(即jo\Uhnny)。 这会将 johnny 中的 h 的其余字符更改为大写。

更改 "John""joHNNY"

$ sed -n 's/John/jo\Uhnny/p' employee.txt
101,joHNNY Doe,CEO

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