如何使用sed和cut在文件中行的某些位置查找和替换值

时间:2019-03-30 09:52:56

标签: shell unix sed cut

在某些情况下,我必须在存储的文本文件中各行的第10个位置用数字3替换数字1。我找不到解决办法。下面是示例文件和代码。

示例文件:

$ 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 个答案:

答案 0 :(得分:1)

尝试

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