我有一個文本文件,其中我想用新字符串替換字符串,然後添加或刪除空格以使它們具有相同數量的字符。例如,我想sed - 用相同數量的字符替換字符串
longer_string .10
本質更換
string .10
我需要更換「字符串」,然後有」 0.10' 在正確的列,數regarldess替換字符串中的字符。
我有一個文本文件,其中我想用新字符串替換字符串,然後添加或刪除空格以使它們具有相同數量的字符。例如,我想sed - 用相同數量的字符替換字符串
longer_string .10
本質更換
string .10
我需要更換「字符串」,然後有」 0.10' 在正確的列,數regarldess替換字符串中的字符。
可以打印線,並附加回車;然後,打印新行:
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
注意,如果替換字符串比原來長這個工作正常。相反,我們可能需要做一些額外的步驟。
Sed是這裏工作的錯誤工具。
你需要的是:
這裏所說:
# 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
這可能爲你工作(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
這將替換string
與longer_string
再追加原線至更新的一個(新行預先計劃在新老弦) 。然後從附加行中刪除字符,直到匹配新字符串的末尾。舊行中的空格(不包括引入的換行符)然後替換修訂行的其餘部分。
嗨@ ericvb86你的意思是這樣的'sed -e's/string/longer_string/g'file.txt'? –
你可以使用ed或vim腳本的替代來做到這一點,否則你不管替換字符串的大小匹配字符串的大小,都可以創建一個腳本來匹配/替換所需的空格,而不考慮diff大小。 – alexscott
Re alexscott的回答:是的,我想說,這看起來更像是一個vi/vim而不是sed的工作。搜索字符串('/^string'),用長字符串替換vim-('Rlonger-string')。我不知道這個確切的vimscript代碼;你需要研究:https://en.wikipedia.org/wiki/Vim_(text_editor)#Vim_script。 –