Bash中通过正则分组匹配替换文件名指定内容为变量值
文件名替换解决方案
针对你需要将格式为_vvvv_id_vvvv.txt(v为可变部分)的文件名中,被下划线包裹的中间id替换为变量$myvar的需求,以下是两种可靠实现方式,可避免因可变部分包含id字符串导致的误替换:
方法一:使用 sed 实现
通过正则捕获整个文件名结构,精准定位中间需要替换的部分:
myvar='bar' f='_12345_23_678.txt' result=$(echo "$f" | sed -E "s/^(_.*)_([^_]+)_(.*\.txt)$/\1_${myvar}_\3/") echo $result # 输出 _12345_bar_678.txt
正则逻辑:
^(_.*):捕获从开头下划线到倒数第二个下划线前的所有内容(保留可变前缀)_([^_]+)_:匹配中间被下划线包裹的目标id片段(确保仅匹配单个下划线分隔的部分)(.*\.txt)$:捕获最后一个下划线到.txt结尾的内容(保留可变后缀)- 替换时将中间的
id片段替换为$myvar,前后捕获内容保持不变
方法二:使用 awk 实现
通过分割字符串定位中间字段,灵活完成替换:
myvar='bar' f='_12345_23_678.txt' result=$(echo "$f" | awk -v var="$myvar" -F '_' '{ output = $1 for(i=2; i<=NF-2; i++) { output = output "_" $i } output = output "_" var "_" $(NF) print output }') echo $result # 输出 _12345_bar_678.txt
逻辑说明:
- 用下划线
_作为分隔符拆分文件名 - 拼接前
NF-2个字段(保留可变前缀部分) - 插入变量
$myvar作为中间替换内容 - 拼接最后一个字段(包含
.txt后缀)
内容的提问来源于stack exchange,提问作者yhu420
相关产品推荐
相关产品推荐

