根据行号和列范围替换文本

时间:2019-11-10 00:14:42

标签: awk sed

在文本文件foo.txt中:

Lorem ipsum dolor sit amet
sed quam rutrum, interdum sodales ex
pellentesque urna placerat

我想用另一个字符串“ fermentum”将第2行上的文本从第10列更改为16 ,结果是:

Lorem ipsum dolor sit amet
sed quam fermentum, interdum sodales ex
pellentesque urna placerat

精度:regex是否可以捕获rutrum需要索引的位置

3 个答案:

答案 0 :(得分:2)

这是一种使用sed来替换第10行(包括第10列)到16行(包括)中第2行中的文本的一种方法。

sed -E '2s/^(.{9})(.{5})(.*)$/\1fermentum\3/' foo.txt > bar.txt

-E用于避免转义括号和类似内容...

2的意思-恰好在第二行

s的意思是substitute

^-行首

(.{9})捕获9个任何单个字符(在这种情况下为'sed quam '

(.{5})捕获下5个字符('rutrum'

(.*)捕获零个或多个剩余字符(', interdum sodales ex'

$-行尾

\1-引用第一个捕获的文本

\3-引用第三个捕获的文本

> bar.txt负责将结果存储在bar.txt

更多详细信息,请参见here

答案 1 :(得分:1)

yesterday(mon, sun).
yesterday(tue, mon).
yesterday(wed, tue).
yesterday(thu, wed).
yesterday(fri, thu).
yesterday(sat, fri).
yesterday(sun, sat).

lies([mon, tue, wed]).

tomorrow(Day, Tomorrow) :-
    yesterday(Tomorrow, Day).

unicornLies1(Day) :- 
    lies(Days),
    member(Day, Days).

unicornLies2(Day) :- 
    tomorrow(Day, Tomorrow),
    unicornLies1(Day),
    unicornLies1(Tomorrow).

sol:- unicornLies1(Day), unicornLies2(Day), write(Day).
[C]$ cat foo.txt | ./line2-col10_16.sed
Lorem ipsum dolor sit amet
sed quam fermentum, interdum sodales ex
pellentesque urna placerat

[C]$ cat foo.txt | ./line2-col10_16.sed > new 
[C]$ diff foo.txt new 
2c2
< sed quam rutrum, interdum sodales ex
---
> sed quam fermentum, interdum sodales ex
[C]$ cat line2-col10_16.sed 

答案 2 :(得分:1)

awk中使用sub实际上很容易。您对awk的工作方式有基本的误解。 (除了GNU awk FIELDWIDTHS扩展名以外),awk不作用于字符,它作用于指定为由FS(域)分隔的 fields -separator,默认-空格)。因此,要对"rutrum,"进行操作,您需要对2 nd 记录中的3 rd field 进行操作。您可以使用FNR == 2(文件记录号)或NR代表正在处理的所有文件的第二行。

针对您的情况的awk解决方案是:

awk 'FNR == 2 {sub(/^rutrum/,"fermentum",$3)}1' file

sub(/find_regex/,"replace"[,target])将可选目标指定为3 rd field

使用/输出示例

使用file中的原始文字,您将获得:

$ awk 'FNR == 2 {sub(/^rutrum/,"fermentum",$3)}1' file
Lorem ipsum dolor sit amet
sed quam fermentum, interdum sodales ex
pellentesque urna placerat

编辑-仅使用行号和列号

如果您不能使用正则表达式,而只能使用行号和列号,那么您仍然可以将awksubstr和字符串连接一起使用。从本质上讲,您只需从该行的前9个字符加上"fermentum"加上16个字符开始构建第2 nd 行,例如

awk 'FNR == 2 {s=substr($0,1,9); s=s "fermentum"; s=s substr($0,16); $0=s}1' file

在字符串s中串联3个片段中的每一个,然后将2 nd 行设置为等于新的串联字符串。 (输出与上面相同)