用行号替换文本文件中的特定字符串(固定位置)

时间:2019-07-08 12:45:06

标签: bash text sed replace

我构建了一个脚本(bash)来替换.txt文件中特定位置的图形。

这是文件data.txt:

Date; Buy; Sell; Coupon; Fee
21/6/2019;0.0000000000;0.0000000000;0.0000000000

我要替换第12个字符。

在第12个位置等于“ 0”的情况下,在更改位置的代码部分下面查找,将数字更改为“ 59”

sed 's/^\(.\{11\}\)0/\159/' data.txt

到目前为止一切都很好,问题是当我只想对最后一行(#34)进行更改时,将文件图像(data.txt)图像显示为:

Date; Buy; Sell; Coupon; Fee
26/4/2006;0.0000000000;-200000000.0;0.0000000000
4/5/2006;0.0000000000;-100000000.0;0.0000000000
4/5/2006;0.0000000000;-300000000.0;0.0000000000
1/12/2006;0.0000000000;0.0000000000;-30000000.00
5/12/2006;0.0000000000;-250000000.0;0.0000000000
8/12/2006;0.0000000000;-250000000.0;0.0000000000
19/12/2006;0.0000000000;-650000000.0;0.000000000
18/1/2007;0.0000000000;-250000000.0;0.0000000000
1/2/2007;0.0000000000;-250000000.0;0.0000000000
2/2/2007;0.0000000000;-720000000.0;0.0000000000
28/3/2007;0.0000000000;-200000000.0;0.0000000000
28/3/2007;0.0000000000;-400000000.0;0.0000000000
3/5/2007;0.0000000000;-250000000.0;0.0000000000
3/5/2007;0.0000000000;-750000000.0;0.0000000000
3/5/2007;0.0000000000;-250000000.0;0.0000000000
5/6/2007;0.0000000000;-500000000.0;0.0000000000
3/7/2007;0.0000000000;-300000000.0;0.0000000000
3/12/2007;0.0000000000;0.0000000000;-281000000.0
1/12/2008;0.0000000000;0.0000000000;-281000000.0
1/12/2009;0.0000000000;0.0000000000;-281000000.0
1/12/2010;0.0000000000;0.0000000000;-281000000.0
5/4/2011;525000000.00;0.0000000000;0.0000000000
1/12/2011;0.0000000000;0.0000000000;-254750000.0
2/11/2012;1348000000.0;0.0000000000;0.0000000000
2/11/2012;840000000.00;0.0000000000;0.0000000000
3/12/2012;0.0000000000;0.0000000000;-145350000.0
2/12/2013;0.0000000000;0.0000000000;-145350000.0
1/12/2014;0.0000000000;0.0000000000;-145350000.0
1/12/2015;0.0000000000;0.0000000000;-145350000.0
1/12/2016;0.0000000000;0.0000000000;-145350000.0
1/12/2017;0.0000000000;0.0000000000;-145350000.0
3/12/2018;0.0000000000;0.0000000000;-145350000.0
21/6/2019;0.0000000000;0.0000000000;0.0000000000

我使用了以下内容:

#!/bin/bash

i=1
while read line;do
if((i==34));then
sed 's/^\(.\{11\}\)0/\159/' data.txt
fi
((i++))

似乎条件存在问题,脚本运行永不停止,没有产生的输出就像没有结束的循环。

2 个答案:

答案 0 :(得分:1)

尝试一下:

sed '$s/^\([^;]\+;\)0\(.*\)/\159\2/' input

地址$告诉sed仅在文件的最后一行工作。除了替换第12个字符外,最好替换第一个;之后的字符。

sed分隔bash的行绝对没有意义。这是sed的核心功能之一,可以循环遍历行。

答案 1 :(得分:0)

以下适用于gawkmawkoriginal-awkbusybox

awk 'END {if(int($2)==0) $2=59; print}' {O,}FS=\; data.txt

输出:

21/6/2019;59;0.0000000000;0.0000000000

在最后一条记录(一行)上,awk检查第二个用分号;分隔的字段的整数值,如果它等于零,则将其更改为59。