在字符串中的前 N ​​个字符后添加连字符,并删除以 # 开头的字符串部分

在字符串中的前 N ​​个字符后添加连字符,并删除以 # 开头的字符串部分

我有一个类似于以下内容的字符串:

391c294eb646cd0f3068cc7ba945071d04327b0ccb181d901466ee3d79c6fe69#3640345

我希望它看起来像这样:

391c-294eb646cd0f3068cc7ba945071d04327b0ccb181d901466ee3d79c6fe69

正如您将看到的,我只想在前 4 个字符后面添加一个连字符,然后删除#字符串中的 及其后面的所有字符。

答案1

使用正则表达式匹配在这里很有帮助:

str='391c294eb646cd0f3068cc7ba945071d04327b0ccb181d901466ee3d79c6fe69#3640345'
[[ "$str" =~ (.{4})([^#]+) ]] && new="${BASH_REMATCH[1]}-${BASH_REMATCH[2]}"
echo "$new"
391c-294eb646cd0f3068cc7ba945071d04327b0ccb181d901466ee3d79c6fe69

BASH_REMATCH数组保存正则表达式的捕获部分,索引 0 保存与整个正则表达式匹配的输入部分。

答案2

使用参数扩展。

#!/bin/bash
expected=391c-294eb646cd0f3068cc7ba945071d04327b0ccb181d901466ee3d79c6fe69
input='391c294eb646cd0f3068cc7ba945071d04327b0ccb181d901466ee3d79c6fe69#3640345'

result=${input%#*}  # Remove everything starting with the last #.
result=${result:0:4}-${result:4}  # Insert the dash.

[[ $result == $expected ]] && echo ok

如果您想要第一个 #,请使用${input%%#*}.

相关内容