我有一个文本文件,我想在其中用新字符串替换字符串,然后添加或删除空格以使它们具有相同数量的字符。例如,我想替换
string .10
带
longer_string .10
本质上我需要替换'string',然后在正确的列中使用'.10',替换字符串中的字符数的regarldess。
答案 0 :(得分:1)
答案 1 :(得分: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
注意,如果替换字符串比原始字符串长,则此方法可以正常工作。相反,我们可能需要做一些额外的步骤。
答案 2 :(得分:0)
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
答案 3 :(得分: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
这会将string
替换为longer_string
,然后将原始行附加到更新的行(新行添加到旧字符串和新字符串之前)。然后从附加行中删除字符,直到匹配新字符串的末尾。旧线的空间(少于引入的换行符)然后替换修改的线的剩余部分。