You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Bash中如何替换(与)包裹的行内所有字符为等长等号?

问题根因

tr是单字符级别的替换命令,会把所有匹配到的指定字符(你命令里写的空格、(、+、))全部替换成=,不会判断字符所在行的格式,因此非目标行里的空格也被误替换。

可用修正命令

方案1:awk(兼容性最好,所有POSIX环境通用)

echo -e "line1 with some words\n( + + +  +    +  +  )\nline3 with some words"|awk '/^\(.*\)$/{gsub(/./,"=")}1'

逻辑说明:

  • /^\(.*\)$/ 匹配以(开头、以)结尾的目标行
  • 对匹配到的行执行gsub(/./,"="),把该行内所有字符替换为等号,长度和原行完全一致
  • 末尾的1是awk简写语法,代表打印所有处理后的行

方案2:GNU sed(Linux系统默认自带sed可直接用)

echo -e "line1 with some words\n( + + +  +    +  +  )\nline3 with some words"|sed -E '/^\(.*\)$/s/./=/g'

逻辑说明:

  • -E 启用扩展正则匹配
  • 先定位到首尾为()的目标行,再对该行执行全局替换,把所有字符换成等号,非目标行完全不做修改

两个命令运行后输出和预期完全一致:

line1 with some words
=====================
line3 with some words

内容的提问来源于stack exchange,提问作者questioneer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.31 06:24:16