如何用 sed 有条件地替换单词?

问题描述 投票:0回答:1

我的文件格式为:

EMPLOYEE
  FIRST NAME: JOHN
  LAST NAME: DOE
  POSITION: ACCOUNT MANAGER
  
EMPLOYEE
  FIRST NAME: BIG
  LAST NAME: BOSS
  POSITION: CEO

嗯,比这更复杂一点,但有一个解决方案就足够了。

我尝试将大小写固定为标题大小写,同时保持对齐方式和字段名称不变:

EMPLOYEE
  FIRST NAME: John
  LAST NAME: Doe
  POSITION: Account Manager
  
EMPLOYEE
  FIRST NAME: Big
  LAST NAME: Boss
  POSITION: CEO

到目前为止我已经使用过这个:

sed -E '/^\s{0,}(FIRST NAME|LAST NAME|POSITION)/ { s/((^\s{0,})(FIRST NAME|LAST NAME|POSITION))/\1/; T; s/(\b[A-Za-z])([A-Za-z]*)\b/\U\1\L\2/g; }' employees.list

但似乎无法避免更改字段名称的大小写(名字,姓氏,职位),所以这些变成:

EMPLOYEE
  First Name: John
  Last Name: Doe
  Position: Account Manager
  
EMPLOYEE
  First Name: Big
  Last Name: Boss
  Position: Ceo 

(还没去处理

CEO
这样的内容)。

这可以通过

sed
实现吗?如果是的话,怎么办?

sed
1个回答
0
投票

{0,}
??只是
*

真正困难的是你想在字符串的part上应用“第一个大写其余小写”正则表达式。我通常做的是将部分输入放入由换行符分隔的旧空间中,然后将其删除。然后我可以处理有趣的部分,最后

h
占据保留空间并重新整理输出。
g

输出:

sed -E ' /: CEO/{p;d} /^(\s*(FIRST NAME|LAST NAME|POSITION):\s*)/{ s//\1\n/ h s/// s/\b([A-Za-z])([A-Za-z]*)\b/\U\1\L\2/g G s/([^\n]*)\n([^\n]*).*/\2\1/ } '

总的来说,考虑一种真正的编程语言,更像是
EMPLOYEE FIRST NAME: John LAST NAME: Doe POSITION: Account Manager EMPLOYEE FIRST NAME: Big LAST NAME: Boss POSITION: CEO

awk
    

© www.soinside.com 2019 - 2024. All rights reserved.