Bash 带有变量的for循环中的Sed命令
我有一个名为dates.txt的文件,其中包含以下内容:Bash 带有变量的for循环中的Sed命令,bash,for-loop,sed,Bash,For Loop,Sed,我有一个名为dates.txt的文件,其中包含以下内容: DATE_1 DATE_2 DATE_3 DATE_4 DATE_5 DATE_6 DATE_7 1 13/03/16 DATE_2 DATE_3 DATE_4 DATE_5 DATE_6 DATE_7 2 3 4 5 6 7 我只想用使用sed命令存储在v数组中的一些日期替换DATE_I。 为此,我尝试了for循环和sed命令(file test.sh): 问题是此命令仅替换第一个日期。如果运行test.sh: $ ./test.s
DATE_1
DATE_2
DATE_3
DATE_4
DATE_5
DATE_6
DATE_7
1
13/03/16
DATE_2
DATE_3
DATE_4
DATE_5
DATE_6
DATE_7
2
3
4
5
6
7
我只想用使用sed命令存储在v数组中的一些日期替换DATE_I。
为此,我尝试了for循环和sed命令(file test.sh):
问题是此命令仅替换第一个日期。如果运行test.sh:
$ ./test.sh
14/03/16
DATE_2
DATE_3
DATE_4
DATE_5
DATE_6
DATE_7
我期望的结果是:
14/03/16
15/03/16
16/03/16
17/03/16
18/03/16
19/03/16
20/03/16
我不明白这为什么不起作用。
谁能解释一下为什么会发生这种情况,并为这个问题提出一个合适的解决方案
谢谢
cat dates.txt | sed 's/^DATE_//g'
这将在行首(
^
)去掉日期
,留下号码(或行上的任何其他内容)。根本不需要循环 解释:发生的事情是,for
循环的第一次迭代消耗了您要输送到其标准输入的所有线路。首先,让我们修改test.sh
,在最后一行包含echo
语句,以便我们可以看到发生了什么:
cat dates.txt|for j in {1..7};do echo $j; sed "s/DATE_$j/${v[$j]}/";done
您将看到test.sh的输出如下所示:
DATE_1
DATE_2
DATE_3
DATE_4
DATE_5
DATE_6
DATE_7
1
13/03/16
DATE_2
DATE_3
DATE_4
DATE_5
DATE_6
DATE_7
2
3
4
5
6
7
接下来,将dates.txt
修改为:
DATE_1
DATE_2
DATE_1
DATE_4
DATE_1
DATE_6
DATE_1
,我们每隔一行将其转换为DATE\u 1
,以便于演示。现在,输出为:
1
13/03/16
DATE_2
13/03/16
DATE_4
13/03/16
DATE_6
13/03/16
2
3
4
5
6
7
因此,您可以看到for
循环的第一次迭代(当$j==1
时)正在处理cat
传递给for
循环的每一行。此后,for
循环($j==2..7
)的后续迭代仍在运行,但它们没有收到任何输入流(因此,在上面的示例中,它们只是回显$j
的当前值,并且不将任何输入传递给sed
)。这就是为什么你观察到它只改变了第一行
解决方案:将最后一行修改为:
for j in {1..7}; do head -$j dates.txt | tail -1 | sed "s/DATE_$j/${v[$j]}/"; done
是的,好的!!我的错误是描述不好!实际上我不想用1,2,3等来代替。。我想用真正的约会代替。这只是对我的一个考验。你说得对,但如果我们想换成另一个词,比如datetime_1,datetime_2等等。。对不起,这个坏例子Thanks@argi您应该根据问题更新问题,以准确显示您的输入和预期输出。就目前而言,它被简化得如此之多,以至于除此之外的任何解决方案都没有多大意义。