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
相关产品推荐
相关产品推荐

