在文本文件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
需要索引的位置
答案 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
编辑-仅使用行号和列号
如果您不能使用正则表达式,而只能使用行号和列号,那么您仍然可以将awk
与substr
和字符串连接一起使用。从本质上讲,您只需从该行的前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 行设置为等于新的串联字符串。 (输出与上面相同)