我需要将值 A 1
添加到以10
开头的所有行的位置10-12,而不管行的长度如何。如果POS 10-12中存在值,则应被值A 1
覆盖。
我尝试了以下内容:
sed -i 's/.{9}/&A 1/' FILE
但是,这给了我两个问题。
- 值" A 1"都添加到所有行中,不仅是以10。 开始的行
- 如果线的长度为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个次要修改。
- 首先,在每条线上添加10个空间,因此短行没有任何问题
- 仅将您的编辑应用于以" 10"开头的行
sed -e 's/$/xxxxxxxxxx/' -e '/^10/s/.{9}/&A 1/' test.txt
x
的代表上方的空间