sed - 用相同数量的字符替换字符串

时间:2016-01-07 11:03:03

标签: regex sed

我有一个文本文件,我想在其中用新字符串替换字符串,然后添加或删除空格以使它们具有相同数量的字符。例如,我想替换

string             .10

longer_string      .10

本质上我需要替换'string',然后在正确的列中使用'.10',替换字符串中的字符数的regarldess。

4 个答案:

答案 0 :(得分:1)

您可以使用sed进行替换,然后将列重新与column重新对齐吗?

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

答案 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. 拆分要处理的字样(&#34;字符串&#34;&amp;&#34; .10&#34;)并将它们存储在变量中
  2. 查找最左侧组件的长度
  3. 修改&#34;字符串&#34;
  4. 以固定宽度列打印修改后的字符串
  5. 这里是:

    # 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,然后将原始行附加到更新的行(新行添加到旧字符串和新字符串之前)。然后从附加行中删除字符,直到匹配新字符串的末尾。旧线的空间(少于引入的换行符)然后替换修改的线的剩余部分。