Bash增量变量单独但sed是全局替换?

时间:2017-08-03 20:02:12

标签: bash shell

在下面的脚本中,我试图替换字母" T"在每一行,使用$ n,然后转到下一行和$ n + 10,但是sed似乎正在替换" T"总数。我错过了什么?谢谢!

#!/bin/bash -x
n=10
i=0
 while [ $i != `wc -l < filename.txt` ]
 do 

 sed -ie "s/T/$n/" filename.txt ;
 n=$(($n+10))  # echo $n

  i=$(($i+1))
  done

3 个答案:

答案 0 :(得分:0)

每次调用时,Sed都会处理整个文件。

你可以通过传递一个地址进行替换来解决这个问题,但与以下替代方案相比,这将是非常低效的:

awk '{ sub(/T/, 10 * NR); print }' filename.txt

这会替换每行/T/的第一次出现,其结果为10 * NR,其中NR是行号。所以第一行的第一个T将被替换为10,第二行的第一个T被20替换,等等。

如果您对命令符合要求感到高兴,可以用标准方式覆盖原始文件:

awk '{ sub(/T/, 10 * NR); print }' filename.txt > tmp && mv tmp file

请注意,此单个命令会替换整个脚本,而不仅仅是在循环内调用sed。

答案 1 :(得分:0)

您正在每次循环迭代处理整个filename.txt。所以最后一次迭代是坚持的。 您需要一次处理一行,然后放在一起并输出完整的文件。

更好的解决方案可能是awk。例如:

 @Override
public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {
    final int position = groupPosition + 1;

    switch (position) {
        case 1:
            allQuestions = MyConstants.QUESTIONS_1;
            break;
        case 2:
            allQuestions = MyConstants.QUESTIONS_2;
            break;
        case 3:
            allQuestions = MyConstants.QUESTIONS_3;
            break;
        case 4:
            allQuestions = MyConstants.QUESTIONS_4;
            break;
        case 5:
            allQuestions = MyConstants.QUESTIONS_5;
            break;
        case 6:
            allQuestions = MyConstants.QUESTIONS_6;
            break;
    }

    int correctQuestions = MyDatabase.getInstance(context).getCorrectQuestions(position).getCount();
    int wrongQuestions = MyDatabase.getInstance(context).getWrongQuestions(position).getCount();
    int openQuestions = allQuestions - correctQuestions - wrongQuestions;

    if (convertView == null) {
        LayoutInflater infalInflater = (LayoutInflater) this.context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        convertView = infalInflater.inflate(R.layout.list_item, null);
    }

    tv_questionOpenResult = (TextView) convertView.findViewById(R.id.tv_questionOpenResult);
    tv_correctAmountResult = (TextView) convertView.findViewById(R.id.tv_correctAmountResult);
    tv_wrongAmountResult = (TextView) convertView.findViewById(R.id.tv_wrongAmountResult);

    bt_openQuestions = (Button) convertView.findViewById(R.id.bt_openQuestions);
    bt_openQuestions.setTag(position);
    bt_correctQuestions = (Button) convertView.findViewById(R.id.bt_correctQuestions);
    bt_wrongQuestions = (Button) convertView.findViewById(R.id.bt_wrongQuestions);


    if (allQuestions == correctQuestions) {
        bt_openQuestions.setEnabled(true);
        bt_openQuestions.setText("Test");
        allCorrect = true;
    }

使用输入文件

#!/usr/bin/awk -f
BEGIN { n=10; }
/T/ {
    print n, $0;
    n=n+10;
}

你得到了

T one
T two
T three

在stdout上。

答案 2 :(得分:0)

#!/bin/bash -x
n=10
i=1
ln=`wc -l < filename.txt`
while [ "$i" -le "$ln" ]
do
sed -ie "$i s/T/$n/" filename.txt ;
n=$(($n+10))  # echo $n
i=$(($i+1))
done

sed -ie "$i s/T/$n/" filename.txt ; - 仅替换$ i行

例如:

cat filename.txt
T aaa
T bbb
T ccc
./a.sh
cat filename.txt
10 aaa
20 bbb
30 ccc