2012-05-14 6 views
6

Tôi muốn thay thế một dòng duy nhất trong một tập tin với nhiều dòng ví dụthay thế một phù hợp với nhiều dòng trong một file

Tôi muốn thay thế một chức năng cuộc gọi cụ thể nói
foo(1,2)

với

if (a > 1) { 
    foo(1,2) 
} else { 
    bar(1,2) 
} 

Tôi có thể làm điều đó bằng cách nào?

+0

gì nếu tôi muốn thay đổi nó inplace trong tập tin hiện tại của tôi mà không tạo ra bất kỳ tập tin thêm. – ravi

+0

@ravi Xem chỉnh sửa của tôi. –

Trả lời

6

Đây là những gì sed s lệnh được xây dựng cho:

shopt -s extglob 

ORIG="foo(1,2)" 
REP="if (a > 1) { 
     foo(1,2) 
} else { 
     bar(1,2) 
}" 

REP="${REP//+(
)/\\n}" 

sed "s/$ORIG/$REP/g" inputfile > outputfile 

Lưu ý rằng REP="${REP//\+( )/\\n}" dòng chỉ cần thiết nếu bạn muốn xác định các REP trong cách định dạng mà tôi đã làm trên dòng hai . Nó có thể đơn giản hơn nếu bạn chỉ sử dụng \n\t trong REP để bắt đầu.

Chỉnh sửa để đáp ứng với câu hỏi của OP

Để thay đổi tập tin ban đầu của bạn mà không cần tạo một tập tin mới, sử dụng sed của --in-place cờ, như vậy:

sed --in-place "s/$ORIG/$REP/g" inputfile 

Xin hãy cẩn thận với --in-place cờ. Tạo bản sao lưu trước khi bạn chạy vì tất cả thay đổi sẽ là vĩnh viễn.

+1

'shopt -s extglob' là bắt buộc và dấu gạch chéo ngược trước dấu cộng cần phải được xóa. –

+0

@DennisWilliamson Cảm ơn bạn đã đánh bắt điều đó. Đôi khi tôi quên rằng hầu hết mọi người không mở rộng globbing theo mặc định. Dấu gạch chéo ngược chỉ còn sót lại từ thử nghiệm. –

+0

Nó đang hoạt động, nhưng tôi không chắc chắn điều này có nghĩa là gì 'REP =" $ {REP // + ( )/\\ n} "' – ravi

1
ORIGINAL="foo(1,2)" 
REPLACEMENT="if (a > 1) { 
foo(1,2) 
} else { 
bar(1,2) 
}" 

while read line; do 
    if [ "$line" = "$ORIGINAL" ]; then 
    echo "$REPLACEMENT" 
    else 
    echo "$line" 
    fi 
done </path/to/your/file> /path/to/output/file 
0

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

cat <<\! | 
> a 
> foo(1,2) 
> b 
> foo(1,2) 
> c 
> ! 
> sed '/foo(1,2)/c\ 
> if (a > 1) {\ 
>  foo(1,2)\ 
> } else {\ 
>  bar(1,2)\ 
> }' 
a 
if (a > 1) { 
    foo(1,2) 
} else { 
    bar(1,2) 
} 
b 
if (a > 1) { 
    foo(1,2) 
} else { 
    bar(1,2) 
} 
c