2016-01-07 86 views
6

我有一個文本文件,其中我想用新字符串替換字符串,然後添加或刪除空格以使它們具有相同數量的字符。例如,我想sed - 用相同數量的字符替換字符串

longer_string  .10 

本質更換

string    .10 

我需要更換「字符串」,然後有」 0.10' 在正確的列,數regarldess替換字符串中的字符。

+0

嗨@ ericvb86你的意思是這樣的'sed -e's/string/longer_string/g'file.txt'? –

+0

你可以使用ed或vim腳本的替代來做到這一點,否則你不管替換字符串的大小匹配字符串的大小,都可以創建一個腳本來匹配/替換所需的空格,而不考慮diff大小。 – alexscott

+0

Re alexscott的回答:是的,我想說,這看起來更像是一個vi/vim而不是sed的工作。搜索字符串('/^string'),用長字符串替換vim-('Rlonger-string ')。我不知道這個確切的vimscript代碼;你需要研究:https://en.wikipedia.org/wiki/Vim_(text_editor)#Vim_script。 –

回答

1

您可以使用sed進行替換,然後重新對齊column

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

請注意'cat file | sed'有一個UUoC。更好的'sed'...'文件。 – fedorqui

+0

UFLA有什麼用?就個人而言,我喜歡說明性的例子從左到右流動:) –

+0

不確定UFLA是什麼:D UUoC是http://porkmail.org/era/unix/award.html:) – fedorqui

1

可以打印線,並附加回車;然後,打印新行:

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

因此,在你的文件將是:

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

注意,如果替換字符串比原來長這個工作正常。相反,我們可能需要做一些額外的步驟。

0

Sed是這裏工作的錯誤工具。

你需要的是:

  1. 拆分的話去努力(「字符串」 &」 0.10" ),並將其存儲在變量
  2. 找到最左邊的部分的長度
  3. 修改「字符串」
  4. 打印在固定寬度的列的改性串

這裏所說:

# 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

這可能爲你工作(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 

這將替換stringlonger_string再追加原線至更新的一個(新行預先計劃在新老弦) 。然後從附加行中刪除字符,直到匹配新字符串的末尾。舊行中的空格(不包括引入的換行符)然後替換修訂行的其餘部分。