如何检查一行上某个位置的字符值,然后使用sed命令在另一行上的另一个位置添加字符

时间:2019-02-19 23:53:51

标签: shell sed

例如。输入文字文件

line 1 - Abchsffmskdv
line 2 - bsdvnld
line 3 - fsdgdhdh

如果第1行的位置9是s,则将第3行的位置4更改为k

输出:

line 1 - Abchsffmskdv
line 2 - bsdvnld
line 3 - fsdkdhdh

2 个答案:

答案 0 :(得分:0)

请尝试以下操作:

sed '
/^.\{8\}s/ {        # if the 9th char == "s" then
    $!n             # flush current line and read next line (unless eof)
    $!n             # same as above to proceed to the line after next
    $!s/^\(.\{3\}\)./\1k/   # replace the 4th char with "k"
}' input.txt

或单线:

sed '/^.\{8\}s/{$!n; $!n; $!s/^\(.\{3\}\)./\1k/}' input.txt

input.txt如下:

Abchsffmskdv
bsdvnld
fsdgdhdh
iiiiiiiisiii
iiiiiii
iiiiiiii

输出:

Abchsffmskdv
bsdvnld
fsdkdhdh
iiiiiiiisiii
iiiiiii
iiikiiii

您将看到上面的脚本替换了下一个下一个的第4个字符 如果找到模式,则与行号无关。 如果您想将行号固定为例如第一行,请尝试:

sed '
1 {
    /^.\{8\}s/ {
        $!n
        $!n
        $!s/^\(.\{3\}\)./\1k/
    }
}' input.txt

输出:

Abchsffmskdv
bsdvnld
fsdkdhdh
iiiiiiiisiii
iiiiiii
iiiiiiii

仅修改第三行。

答案 1 :(得分:0)

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

sed -E '1h;3{G;s/(...).(.*)\n.{8}s/\1k\2/}' file

将第一行存储在保留空间中,并将其添加到第3行,并根据所需条件进行模式匹配。

替代方法:

sed -E '1h;3{x;/^.{8}s/{x;s/./k/4;x};x}' file