我有一个非常大的制表符分隔文件,我想用另一个替换此文件中的一行。由于该行具有> 100列,因此简单的sed&s / find / replace /'是不可取的。我的换行符存储在newline.txt文件中
我如何实现:
sed 's/find/newline.txt/' infile
答案 0 :(得分:5)
使用GNU sed:
在文件file.csv
中查找包含find
,附加文件r
的内容(newline.txt
)和删除(d
)行的文件find
行1}}:
sed -e '/find/{r newline.txt' -e 'd}' file.csv
答案 1 :(得分:2)
来自@Aaron
sed "s/^.*find.*$/$(cat newline.txt)/" infile.txt
find 是infile.txt中唯一一个返回单行的字符串,然后该行被newline.txt替换
答案 2 :(得分:1)
基于GNU sed 4.2.2,还包括来自Cyrus和Aaron的答案
$ cat foo.txt
1 abc
2 ijk!
3 pqr
4 xyz
$ cat f1.txt
a/b/c
$ cat f2.txt
line
$ cat f3.txt
line a
line b
1)模式和替换不包含由于双引号内的sed
替换而导致bash
命令或奇怪行为的字符
$ sed "/3/c $(< f2.txt)" foo.txt
1 abc
2 ijk!
line
4 xyz
$ sed "s/.*3.*/$(< f2.txt)/" foo.txt
1 abc
2 ijk!
line
4 xyz
$ sed -e '/3/{r f2.txt' -e 'd}' foo.txt
1 abc
2 ijk!
line
4 xyz
2)由于bash
替换
$ sed "/!/c $(< f2.txt)" foo.txt
bash: !/c: event not found
$ sed '/!/c '"$(< f2.txt)" foo.txt
1 abc
line
3 pqr
4 xyz
$ sed "s/.*!.*/$(< f2.txt)/" foo.txt
bash: !.*/$: event not found
$ sed 's/.*!.*/'"$(< f2.txt)/" foo.txt
1 abc
line
3 pqr
4 xyz
$ sed -e '/!/{r f2.txt' -e 'd}' foo.txt
1 abc
line
3 pqr
4 xyz
3)包含影响sed
$ sed "/3/c $(< f1.txt)" foo.txt
1 abc
2 ijk!
a/b/c
4 xyz
$ sed "s/.*3.*/$(< f1.txt)/" foo.txt
sed: -e expression #1, char 11: unknown option to `s'
$ sed "s|.*3.*|$(< f1.txt)|" foo.txt
1 abc
2 ijk!
a/b/c
4 xyz
$ sed -e '/3/{r f1.txt' -e 'd}' foo.txt
1 abc
2 ijk!
a/b/c
4 xyz
4)用多行替换
$ sed "/3/c $(< f3.txt)" foo.txt
sed: -e expression #1, char 14: extra characters after command
$ sed "s/.*3.*/$(< f3.txt)/" foo.txt
sed: -e expression #1, char 14: unterminated `s' command
$ sed -e '/3/{r f3.txt' -e 'd}' foo.txt
1 abc
2 ijk!
line a
line b
4 xyz
答案 3 :(得分:0)
试试这个
sed s/find/$(< newline.txt)/ infile