替换文件中特定位置的字符

替换文件中特定位置的字符

我有一个如下文件,想用 # 替换第二个位置的逗号:

1K,1,,,,,,,,,,,0.10000000E+00,0.2837726134152E+08,0.6756896377655E+02
1K,2,,,,,,,,,,,0.10000000E+00,0.2837950666514E+08,0.6757007624345E+02
1K,3,,,,,,,,,,,0.10000000E+00,0.2837975330813E+08,0.6756827852038E+02
1K,8,,,,,,,,,,,0.10000000E+00,0.2610685746631E+08,0.1832495587770E+03
1K,9,,,,,,,,,,,0.10000000E+00,0.2610716318002E+08,0.1836118051089E+03
1K10,,,,,,,,,,,0.10000000E+00,0.2609596327361E+08,0.1822385749588E+03
1K11,,,,,,,,,,,0.10000000E+00,0.2610713453046E+08,0.1841214115744E+03
1K12,,,,,,,,,,,0.10000000E+00,0.2610673990054E+08,0.1846882770826E+03
1K18,,,,,,,,,,,0.10000000E+00,0.2610076439025E+08,0.1854595804085E+03

我尝试了这个,但删除了逗号之前的字符:

sed 's/^\(.\{2\}\),/\#/' input_file

取得的成果:

#1,,,,,,,,,,,0.10000000E+00,0.2837726134152E+08,0.6756896377655E+02
#2,,,,,,,,,,,0.10000000E+00,0.2837950666514E+08,0.6757007624345E+02
#3,,,,,,,,,,,0.10000000E+00,0.2837975330813E+08,0.6756827852038E+02
#8,,,,,,,,,,,0.10000000E+00,0.2610685746631E+08,0.1832495587770E+03
#9,,,,,,,,,,,0.10000000E+00,0.2610716318002E+08,0.1836118051089E+03
1K10,,,,,,,,,,,0.10000000E+00,0.2609596327361E+08,0.1822385749588E+03
1K11,,,,,,,,,,,0.10000000E+00,0.2610713453046E+08,0.1841214115744E+03
1K12,,,,,,,,,,,0.10000000E+00,0.2610673990054E+08,0.1846882770826E+03
1K18,,,,,,,,,,,0.10000000E+00,0.2610076439025E+08,0.1854595804085E+03

期望的结果:

1K#1,,,,,,,,,,,0.10000000E+00,0.2837726134152E+08,0.6756896377655E+02
1K#2,,,,,,,,,,,0.10000000E+00,0.2837950666514E+08,0.6757007624345E+02
1K#3,,,,,,,,,,,0.10000000E+00,0.2837975330813E+08,0.6756827852038E+02
1K#8,,,,,,,,,,,0.10000000E+00,0.2610685746631E+08,0.1832495587770E+03
1K#9,,,,,,,,,,,0.10000000E+00,0.2610716318002E+08,0.1836118051089E+03
1K10,,,,,,,,,,,0.10000000E+00,0.2609596327361E+08,0.1822385749588E+03
1K11,,,,,,,,,,,0.10000000E+00,0.2610713453046E+08,0.1841214115744E+03
1K12,,,,,,,,,,,0.10000000E+00,0.2610673990054E+08,0.1846882770826E+03
1K18,,,,,,,,,,,0.10000000E+00,0.2610076439025E+08,0.1854595804085E+03

答案1

,其实需要替换的逗号#就在位置上3

sed 's/^\(..\),/\1#/' input_file
  • ^- 弦锚的开始

  • (..)- 第一个捕获的组包含前 2 个字符

  • \1- 参考第一个捕获组


输出:

1K#1,,,,,,,,,,,0.10000000E+00,0.2837726134152E+08,0.6756896377655E+02
1K#2,,,,,,,,,,,0.10000000E+00,0.2837950666514E+08,0.6757007624345E+02
1K#3,,,,,,,,,,,0.10000000E+00,0.2837975330813E+08,0.6756827852038E+02
1K#8,,,,,,,,,,,0.10000000E+00,0.2610685746631E+08,0.1832495587770E+03
1K#9,,,,,,,,,,,0.10000000E+00,0.2610716318002E+08,0.1836118051089E+03
1K10,,,,,,,,,,,0.10000000E+00,0.2609596327361E+08,0.1822385749588E+03
1K11,,,,,,,,,,,0.10000000E+00,0.2610713453046E+08,0.1841214115744E+03
1K12,,,,,,,,,,,0.10000000E+00,0.2610673990054E+08,0.1846882770826E+03
1K18,,,,,,,,,,,0.10000000E+00,0.2610076439025E+08,0.1854595804085E+03

答案2

sed 's/^\(..\),\([0-9]\)/\1#\2/' input_file

看来您对正则表达式不熟悉。这个问题就像一个不应该问的问题一样简单。

答案3

use below command to get the desired result

input file u.txt

1K,1,,,,,,,,,,,0.10000000E+00,0.2837726134152E+08,0.6756896377655E+02
1K,2,,,,,,,,,,,0.10000000E+00,0.2837950666514E+08,0.6757007624345E+02
1K,3,,,,,,,,,,,0.10000000E+00,0.2837975330813E+08,0.6756827852038E+02
1K,8,,,,,,,,,,,0.10000000E+00,0.2610685746631E+08,0.1832495587770E+03
1K,9,,,,,,,,,,,0.10000000E+00,0.2610716318002E+08,0.1836118051089E+03
1K10,,,,,,,,,,,0.10000000E+00,0.2609596327361E+08,0.1822385749588E+03
1K11,,,,,,,,,,,0.10000000E+00,0.2610713453046E+08,0.1841214115744E+03
1K12,,,,,,,,,,,0.10000000E+00,0.2610673990054E+08,0.1846882770826E+03
1K18,,,,,,,,,,,0.10000000E+00,0.2610076439025E+08,0.1854595804085E+03


command: sed "s/,/#/1" u.txt

sed "s/,/#/1" u.txt 
1K#1,,,,,,,,,,,0.10000000E+00,0.2837726134152E+08,0.6756896377655E+02
1K#2,,,,,,,,,,,0.10000000E+00,0.2837950666514E+08,0.6757007624345E+02
1K#3,,,,,,,,,,,0.10000000E+00,0.2837975330813E+08,0.6756827852038E+02
1K#8,,,,,,,,,,,0.10000000E+00,0.2610685746631E+08,0.1832495587770E+03
1K#9,,,,,,,,,,,0.10000000E+00,0.2610716318002E+08,0.1836118051089E+03
1K10#,,,,,,,,,,0.10000000E+00,0.2609596327361E+08,0.1822385749588E+03
1K11#,,,,,,,,,,0.10000000E+00,0.2610713453046E+08,0.1841214115744E+03
1K12#,,,,,,,,,,0.10000000E+00,0.2610673990054E+08,0.1846882770826E+03
1K18#,,,,,,,,,,0.10000000E+00,0.2610076439025E+08,0.1854595804085E+03

答案4

如果您可以制作一个模式,其中每个“K,”出现都必须是“K#”,则可以进行以下sed替换:

sed 's/K,/K#/g' input_file

相关内容