两个标签替换文本 - sed的

问题描述:

我有以下输入文件:两个标签替换文本 - sed的

text1 text2 text3 text4 
abc1 abc2 abc3 abc4 

,我试图找到两个标签之间的第二个字符串(例如文本2,ABC2),并用另一个词替换它。

我试图与

sed s'/\t*\t/sample/1' 

,但它只是删除选项卡,并不能取代这个词。

我感谢任何帮助!

+0

欢迎来到本站!查看[tour](http://*.com/tour)了解更多信息(和徽章:))。请提供您认为有用的答案,然后点击您最终使用的答案将其标记为已接受的答案。 – cxw

我会建议使用AWK这里:

awk 'BEGIN { FS = OFS = "\t" } { $2 = "sample" } 1' file 

设置的输入和输出字段分隔符的选项卡并更改第二个字段。最后的1始终为真,因此awk执行默认操作{ print }

+0

伟大的思想思考 - 只有13秒分开:) – cxw

+0

或''awk -v OFS ='\ t''$ 2 =“sample”'' – karakfa

+0

我最终使用这个选项,因为它允许我改变到其他专栏更实际。非常感谢!! – pcuser

使用此sed

sed 's/\t[^\t]*\t/\tsample\t/' 
+0

是的。OP可能会将'*'运算符误解为shell匹配运算符 - 即“匹配任何内容” - 而不是它在(sed或其他)正则表达式中的实际含义。 OP的原始模式'\ t * \ t'表示'匹配零个或多个选项卡,后跟一个选项卡',因此确实只会删除第一个选项卡序列。 –

+0

sat,这适用于四列,但如果有第五列,则替换第二和第四列。 – cxw

+0

@cxw,你说得对。更新了答案。 – sat

在GAWK的选择,因为您标记awk ---

gawk -- 'BEGIN {FS="\t"; OFS="\t"} {$2="sample"; print}' 

例如,

echo -e 'a\tb\tc\td' | gawk -- 'BEGIN {FS="\t"; OFS="\t"} {$2="sample"; print}' 

打印

a sample c  d 

FS在制表符处打破输入,OFS使用制表符分隔输出字段,并且$2="sample"仅更改第二个字段,其余字段保持不变。

+0

fyi没有什么特定的gawk,它可以在任何awk中工作。 –

试试这个

sed -e 's/\([a-zA-Z0-9]*\) \([a-zA-Z0-9]*\) \([a-zA-Z0-9]*\) \([a-zA-Z0-9]*\)/\1 sample \2 \3 \4/' 

在GNU的sed v4.2.2我不得不使用-r

sed -r 's/^([^\t]*\t)[^\t]*/\1sample/' 

^([^\t]*\t)是第一场和第一个选项卡,以及[^\t]*是文第二场。 \1恢复第一个字段和sample是你想要的任何东西:)。

例如,

echo -e 'a\tb\tc\td' | sed -r 's/^([^\t]*\t)[^\t]*/\1sample/' 

打印

a  sample c  d 

这也适用于四个columnns等。例如

$ echo -e 'a\tb\tc' | sed -r 's/^([^\t]*\t)[^\t]*/\1sample/' 
a  sample c 

$ echo -e 'a\tb\tc\td\te' | sed -r 's/^([^\t]*\t)[^\t]*/\1sample/' 
a  sample c  d  e