在文件中使用sed替换行与另一个文件

时间:2016-09-09 12:23:55

标签: linux bash sed

我有一个非常大的制表符分隔文件,我想用另一个替换此文件中的一行。由于该行具有> 100列,因此简单的sed&s / find / replace /'是不可取的。我的换行符存储在newline.txt文件中

我如何实现:

sed 's/find/newline.txt/' infile

4 个答案:

答案 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,还包括来自CyrusAaron的答案

$ 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