Как проверить значение символа в позиции в строке, а затем добавить символ в другой позиции в другой строке, используя команду sed - PullRequest
0 голосов
/ 20 февраля 2019

Например.Входной текстовый файл

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 голосов
/ 20 февраля 2019

Это может сработать для вас (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
0 голосов
/ 20 февраля 2019

Пожалуйста, попробуйте следующее:

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

output:

Abchsffmskdv
bsdvnld
fsdkdhdh
iiiiiiiisiii
iiiiiii
iiikiiii

Вы увидите, что приведенный выше скрипт заменяет 4-й символ следующей следующей строки, если шаблон найден независимо от номера строки.Если вы хотите зафиксировать номер строки, например, в 1-й строке, попробуйте вместо этого:

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

output:

Abchsffmskdv
bsdvnld
fsdkdhdh
iiiiiiiisiii
iiiiiii
iiiiiiii

, который изменяет только 3-ю строку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...