2016-01-07 15 views
6

Tôi có một tệp văn bản mà tôi muốn thay thế một chuỗi bằng một chuỗi mới, sau đó thêm hoặc xóa dấu cách để tạo cùng một số ký tự. Ví dụ, tôi muốn thay thếsed - thay thế chuỗi có số ký tự bằng nhau

string    .10 

với

longer_string  .10 

Về bản chất tôi cần phải thay thế 'chuỗi', và sau đó có' .10' trong cột đúng, regarldess số lượng ký tự trong chuỗi thay thế.

+0

Xin chào @ ericvb86 bạn có ý nghĩa giống cái này 'sed -e' s/string/longer_string/g 'file.txt'? –

+0

bạn có thể sử dụng thay thế tập lệnh ed hoặc vim để làm điều đó nếu không bạn sẽ tạo một tập lệnh không phụ thuộc vào kích thước chuỗi của chuỗi thay thế để khớp/thay thế khoảng trống cần thiết bất kể kích thước khác. – alexscott

+0

Re alexscott của câu trả lời: có, tôi sẽ nói rằng điều này trông giống như nhiều hơn một công việc cho vi/vim hơn sed. Tìm kiếm chuỗi ('/^string'), vim-replace bằng chuỗi dài hơn (' Rlonger-string '). Tôi không biết mã vimscript chính xác cho việc này; bạn cần nghiên cứu: https://en.wikipedia.org/wiki/Vim_(text_editor)#Vim_script. –

Trả lời

1

Bạn có thể sử dụng sed để thực hiện việc thay thế và sau đó có thể căn chỉnh lại các cột với column?

cat input.txt | sed 's/string/longer_string/g' | column -t 
+1

Lưu ý 'tệp cat | sed' có UUoC. Tệp 'sed '...' tốt hơn. – fedorqui

+0

Có gì với UFLA?Cá nhân, tôi thích các ví dụ minh họa để chuyển từ trái sang phải :) –

+0

Không chắc chắn UFLA là gì: D UUoC là http://porkmail.org/era/unix/award.html:) – fedorqui

1

Bạn có thể in dòng và nối thêm dấu xuống dòng; sau đó, in các dòng sản phẩm mới:

while IFS= read -r line; 
do 
    echo -ne "$line\r" 
    echo -ne "longer_string" 
done < file 

Vì vậy, trong tập tin của bạn nó sẽ là:

$ while IFS= read -r line; do echo -ne "$line\r"; echo -ne "longer_string"; done < file 
longer_string  .10 

Lưu ý làm việc này tốt nếu các chuỗi thay thế dài hơn bản gốc. Ngược lại, chúng ta có thể cần thực hiện thêm một số bước.

0

Sed là công cụ sai cho công việc tại đây.

gì bạn cần là:

  1. Chia các từ để làm việc trên ("chuỗi" &" .10") và lưu trữ chúng trong các biến
  2. Tìm chiều dài của các thành phần tận cùng bên trái
  3. Sửa "chuỗi"
  4. in các dây sửa đổi trong cột chiều rộng cố định

đây đi:

# 1 
str="string    .10" 
a=$(echo "$str" | awk '{print $1}') 
b=$(echo "$str" | awk '{print $2}') 

# 2 
# note the use of `echo -n` to avoid n+1 errors with `wc`. It does not change anything here because we're subtracting anyway, but if you play around it might bite you. 
str_length=$(echo -n "$str" | wc -c) 
b_length=$(echo -n "$b" | wc -c) 
leftmost_length=$(($str_length - $b_length)) 

# 3 
a="longer_${a}" 

# 4 
printf "%-${leftmost_length}s %-10s\n" "$a" "$b" 
# longer_string  .10 
0

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

sed -r 's/string(.*)/\nlonger_string\1\n&/;ta;:a;s/\n(\S)(.*\n)./\1\n\2/;ta;s/\n.*\n(.*)/\1/' file 

này thay thế string với longer_string và sau đó gắn thêm dòng ban đầu đến một trong những cập nhật (dòng mới được thêm vào phía trước chuỗi cũ và mới) . Sau đó, các ký tự được loại bỏ khỏi dòng được nối vào cho đến khi kết thúc chuỗi mới được khớp. Các khoảng trống (ít dòng giới thiệu) từ dòng cũ sau đó thay thế phần còn lại của dòng đã sửa đổi.

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