bash-将值添加到文件中的特定位置



我需要将值 A 1添加到以10开头的所有行的位置10-12,而不管行的长度如何。如果POS 10-12中存在值,则应被值A 1覆盖。

我尝试了以下内容:

sed -i 's/.{9}/&A 1/' FILE

但是,这给了我两个问题。

  1. 值" A 1"都添加到所有行中,不仅是以10。
  2. 开始的行
  3. 如果线的长度为12个位置,则该值不会被打印到线路。

输入文件:

01SAGHSUIGAUGB    
02AWRHGAWRUIGH    
10H    
02DFHAliffh    
10shaofgvasuioghsfag    
02GAQTHEGHQ    
10FGHOHGFRT    
90AIRLGBA

输出文件:

01SAGHSUIGAUGB
02AWRHGAWRUIGH
10H      A 1
02DFHAliffh
10shaofgvA 1ioghsfag
02GAQTHEGHQ
10FGHOHGFA 1
90AIRLGBA
sed '/^10/ {
   s/^(.{9}).../1A 1/
   t
   s/$/        /
   s/^(.{9}).*/1A 1/
   }' YourFile

如果从10开始,请更改,请尝试通过A 1更改,如果字符串大于12个字符,如果失败了,则添加足够的空间达到9个字符并添加A 1

sed -i 's/(10.{0,8}).{0,2}(.*)/1A 12/' FILE几乎有效,唯一的问题是,如果行小于10个字符,则不会添加它。

结果:

$ sed 's/(10.{0,8}).{0,3}(.*)/1A 12/' test.txt 
01SAGHSUIGAUGB    
02AWRHGAWRUIGH    
10H    A 1
02DFHAliffh    
10shaofgvaA 1suioghsfag    
02GAQTHEGHQ    
10FGHOHGFRA 1T    
90AIRLGBA

也可以写入。根据 1和 2的尺寸。如果您有更多的小组,则将其引用 3 4,依此类推。

正如其他人指出的那样,您可以首先使用线条以确保在正确的列上获得A 1,但是您需要使用SED

以外的其他东西

这很难与SED一起使用,因为它需要计数。您可以使用perl:

perl -lpe 'if(/^10/){ $_ = sprintf("%-12s",$_); s/(.{9}).../$1A 1/;};' input

和bash脚本版本:

while read line; do
    echo "$(printf "%-12s" "$line" | sed 's/^(10.{7}).../1A 1/')"
done < input

给出:

01SAGHSUIGAUGB    
02AWRHGAWRUIGH    
10H      A 1
02DFHAliffh    
10shaofgvA 1ioghsfag    
02GAQTHEGHQ    
10FGHOHGFA 1   
90AIRLGBA

这将正常工作:

awk '/^10/{$0=$0 "          ";q=substr($0,1,9);r=substr($0,13); $0=q "A 1" r} {sub(/ *$/,x);print}' t
01SAGHSUIGAUGB
02AWRHGAWRUIGH
10H      A 1
02DFHAliffh
10shaofgvA 1ioghsfag
02GAQTHEGHQ
10FGHOHGFA 1
90AIRLGBA

这可能对您有用(gnu sed):

sed -r '/^10/{:a;s/^.{,11}$/& /;ta;s/^(.{9}).../1A 1/}' file

如果需要的话,带有空间的垫子线,然后用A 1替换字符10-12。

使用自己的解决方案,并进行2个次要修改。

  1. 首先,在每条线上添加10个空间,因此短行没有任何问题
  2. 仅将您的编辑应用于以" 10"开头的行

sed -e 's/$/xxxxxxxxxx/' -e '/^10/s/.{9}/&A 1/' test.txt

x的代表上方的空间

相关内容

  • 没有找到相关文章