在下面的脚本中,我试图替换字母" 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
答案 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