2016-04-22 108 views
0

我有以下輸入文件:兩個標籤替換文本 - sed的

text1 text2 text3 text4 
abc1 abc2 abc3 abc4 

,我試圖找到兩個標籤之間的第二個字符串(例如文本2,ABC2),並用另一個詞替換它。

我試圖與

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

,但它只是刪除選項卡,並不能取代這個詞。

我感謝任何幫助!

+0

歡迎來到本站!查看[tour](http://stackoverflow.com/tour)瞭解更多信息(和徽章:))。請提供您認爲有用的答案,然後點擊您最終使用的答案將其標記爲已接受的答案。 – cxw

回答

1

我會建議使用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

1

使用此sed

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

是的。OP可能會將'*'運算符誤解爲shell匹配運算符 - 即「匹配任何內容」 - 而不是它在(sed或其他)正則表達式中的實際含義。 OP的原始模式'\ t * \ t'表示'匹配零個或多個選項卡,後跟一個選項卡',因此確實只會刪除第一個選項卡序列。 –

+0

sat,這適用於四列,但如果有第五列,則替換第二和第四列。 – cxw

+0

@cxw,你說得對。更新了答案。 – sat

0

在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中工作。 –

0

試試這個

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

在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