Bash脚本数字处理需求实现求助:将首位0替换为92,无0则前缀添加92
解决文本行开头数字的格式转换需求
首先,咱们先明确你的核心需求:
- 若行首是
0,把这个0替换成92 - 若行首既不是
0也不是92,在数字前添加92 - 行首已经是
92的话,保持原样(逻辑上默认保留原格式)
你的现有脚本用awk '$0*=1'其实是把字符串转成数值,会直接去掉前导0,没法实现替换/添加92的逻辑,咱们来针对性改进它。
方案一:用Awk一行搞定(推荐)
Awk处理文本效率很高,尤其适合这种按行处理的场景,直接一行命令就能完成,不需要额外循环:
awk '{ if ($0 ~ /^0/) { sub(/^0/, "92"); print } else if ($0 !~ /^92/) { print "92" $0 } else { print } }' test.txt > test2.txt
逻辑拆解:
$0 ~ /^0/:判断当前行是否以0开头sub(/^0/, "92"):精准替换行首的0为92$0 !~ /^92/:判断当前行不是以92开头- 符合条件就拼接
92在前面,否则直接输出原行
用你的测试文件运行后,输出完全符合预期:
923333333333
923848123249
方案二:改进你的Bash循环写法
如果你想保留循环的思路,可以用Bash原生的字符串匹配来处理:
#!/bin/bash input_file="test.txt" output_file="test2.txt" # 先清空输出文件,避免重复运行时内容累加 > "$output_file" while IFS= read -r line; do if [[ "$line" == 0* ]]; then # 只替换行首的0为92 echo "${line/#0/92}" >> "$output_file" elif [[ "$line" != 92* ]]; then # 行首不是92,直接添加前缀 echo "92$line" >> "$output_file" else # 已经是92开头,直接输出原行 echo "$line" >> "$output_file" fi done < "$input_file"
逻辑拆解:
${line/#0/92}:Bash参数扩展语法,仅替换字符串开头的0为92[[ "$line" == 0* ]]:简单直观判断行首是否为0[[ "$line" != 92* ]]:判断行首不是92的情况
方案三:用Sed快速处理
Sed也是轻量文本处理的利器,适合简单的替换场景:
sed -e 's/^0/92/' -e 's/^\(92\)\@!/92&/' test.txt > test2.txt
逻辑拆解:
s/^0/92/:把行首的0替换成92s/^\(92\)\@!/92&/:匹配行首不是92的内容,在前面添加92(&代表匹配到的原内容)
注:这个Sed方案需要GNU Sed支持,如果你用的是MacOS自带的Sed,可能需要调整语法,所以Awk方案兼容性更强。
内容的提问来源于stack exchange,提问作者Eveline Ribka Nelwan
相关产品推荐
相关产品推荐

