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

У меня есть случай, когда мне нужно заменить число 1 номером 3 в десятом месте различных строк в сохраненном текстовом файле.Я не могу найти способ сделать это.Ниже приведен пример файла и кода.

Пример файла:

$ cat testdata.txt
1  43515 8 1 victor    Samuel    20190112
3215736  4 6 Michael   pristine  20180923
1  56261 1 1 John      Carter    19880712
#!/bin/sh
filename=testdata.txt
echo "reading number of line"
nol=$(cat $filename | wc -l)
flag[$nol]=''
echo "reading content of file"
for i in (1..$nol)
do
flag=($cut -c10-11 $filename)
if($flag==1)
sed 's/1/3/2'
fi
done

Но это не работает.

Пожалуйста, помогите решить эту проблему.

Обновлено:

Пример вывода:

1  43515 8 1 victor    Samuel    20190112
3215736  4 6 Michael   pristine  20180923
1  56261 3 1 John      Carter    19880712

1 Ответ

1 голос
/ 31 марта 2019

попробуйте это

sed "s/^\(.\{8\}\) 1 \(.*\)$/\1 3 \2/g" testdata.txt > new_testdata.txt

Если sed поддерживает опцию -i, вы также можете редактировать на месте.

sed -i "s/^\(.\{8\}\) 1 \(.*\)$/\1 3 \2/g" testdata.txt

выход

1  43515 8 1 victor     Samuel 20190112
3215736 4 6 Michael pristine 20180923
1  56261 3 1 John      Carter    19880712

Объяснение

s              # substitute
/^\(           # from start of line, save into arg1
.\{8\}         # the first 8 characters
\) 1 \(        # search pattern ' 1 '
.*             # save the rest into arg2
\)$/           # to the end of the line
\1 3 \2        # output: arg1 3 arg2
/g             # global on whole line
...