重击字符串替换/匹配:跳过第一个匹配项

时间:2019-04-29 16:23:16

标签: bash sed

我有一个字符串通过管道传递到此bash命令:sed -n '/^[*] / { s/^[*] \(.*\)/\1/; s,/,:,; s/-/ /g; p; }'。该字符串将始终采用以下格式:XYZ-1234/a-string-of-words-separated-by-dashes。但是,此解决方案将删除匹配的第一个破折号,并且在冒号后不添加空格。如何调整此值,以使输出为:XYZ-1234: A string of words separated by dashes。还要注意冒号大写后的第一个字符。

1 个答案:

答案 0 :(得分:1)

您可以像这样使用awk

awk -F'/' '/^[*] /{m=$1;n=$2;gsub(/^[*] /, "", m); gsub(/-/, " ", n); print m": "toupper(substr(n,1,1)) substr(n, 2)}' file > newfile

详细信息

  • -F'/'-字段分隔符设置为/
  • /^[*] /-查找以*和空格开头的所有行
  • m=$1;n=$2;-字段1分配给m,字段2值分配给n
  • gsub(/^[*] /, "", m);-删除开头的"* "
  • gsub(/-/, " ", n);-用-中的空格替换所有n
  • print m": "toupper(substr(n,1,1)) substr(n, 2)}'-打印结果:将m值,:和空格,然后将n值与大写字母连接起来。

请参见online demo

s="* XYZ-1234/a-string-of-words-separated-by-dashes"
awk -F'/' '/^[*] /{m=$1;n=$2;gsub(/^[*] /, "", m); gsub(/-/, " ", n); print m": "toupper(substr(n,1,1)) substr(n, 2)}' <<< "$s"
# => XYZ-1234: A string of words separated by dashes