2012-05-16 25 views
16

Tôi có một tập tin với các nội dung sau:thay thế một chuỗi vô danh giữa hai chuỗi được biết đến với sed

WORD1 WORD2 WORD3

Làm thế nào tôi có thể sử dụng sed để thay thế chuỗi giữa WORD1 và WORD3 với foo, như vậy mà nội dung của file được thay đổi như sau ?:

WORD1 foo WORD3

tôi đã thử các sau đây, nhưng rõ ràng là tôi đang thiếu một cái gì đó bởi vì đó không tạo ra kết quả mong muốn:

sed -i '' 's/WORD1.*WORD3/foo/g' file.txt

+0

Có thể có một cái gì đó như ' WORD1 foo Thanh WORD3 WORD1 baz WORD3' trong chuỗi của bạn (i. e. nhiều hơn một kết quả cho mỗi chuỗi)? –

+0

Ah - câu hỏi hay, nhưng không, nó không thực sự cần thiết để phù hợp với nhiều hơn một trận đấu trong kịch bản này. –

Trả lời

15
sed -i 's/WORD1.*WORD3/WORD1 foo WORD3/g' file.txt 

hoặc

sed -i 's/(WORD1).*(WORD3)/\1 foo \2/g' file.txt 

Bạn có thể cần phải thoát khỏi dấu ngoặc tròn, phụ thuộc vào biến thể sed của bạn.

+0

Tôi nên làm gì để cho phép WORD1, WORD2 và WORD3 là bất kỳ chuỗi nào? –

+0

@ValeriyVan, bạn cần phải thoát khỏi các ký tự phân cách trong WORD của bạn ('/' trong ví dụ của tôi) cũng như tất cả các ký tự khác, mà 'sed' coi là điều khiển. – vyegorov

2

nội dung của một mẫu file.txt

$ cat file.txt 
WORD1 WORD2 WORD3 
WORD4 WORD5 WORD6 
WORD7 WORD8 WORD9 

(Correction bởi @DennisWilliamson trong comment)
$ sed -e 's/\([^ ]\+\) \+\([^ ]\+\) \+\(.*\)/\1 foo \3/' file.txt

WORD1 foo WORD3 
WORD4 foo WORD6 
WORD7 foo WORD9 

khi awk là bằng cách nào đó đơn giản hơn

$ awk -F' ' '{ print $1" foo "$3 }' file.txt

WORD1 foo WORD3 
WORD4 foo WORD6 
WORD7 foo WORD9 
+1

Không cần phải thoát khỏi bất kỳ không gian nào. Và '[^ \]' có nghĩa là "bất kỳ ký tự nào khác ngoài dấu cách hay dấu gạch chéo ngược. Tôi sẽ đề nghị' \ + 'thay vì' * 'vì, lệnh của bạn có thể thay thế một dòng trống. –

+0

@DennisWilliamson, đánh giá cao nhận xét của bạn, cảm ơn – Rony

+0

Bây giờ nó sẽ không hoạt động chút nào Bạn hiểu nhầm ý tôi là gì. [^] \ + \) \ + \ (. * \)/\ 1 foo \ 3/'file.txt' –

5

Điều này có thể làm việc cho bạn:

sed 's/\S\+/foo/2' file 

hoặc có lẽ:

sed 's/[^[:space:]][^[:space:]]*/foo/2' file 

Nếu WORD1WORD3 xảy ra nhiều hơn một lần:

echo "WORD1 WORD2 WORD3 BLA BLA WORD1 WORD4 WORD3" | 
sed 's/WORD3/\n&/g;s/\(WORD1\)[^\n]*\n/\1 foo /g' 
WORD1 foo WORD3 BLA BLA WORD1 foo WORD3 
+0

'[^ [: không gian:]] [^ [: dấu cách :]] * 'có thể được thay thế bởi' [^ [: space:]] \ + '(như bạn đã sử dụng trong ví dụ đầu tiên của bạn) trong một số phiên bản' sed'. '/ 2' là một liên lạc tốt đẹp. 1 –

Các vấn đề liên quan