Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 带有变量的for循环中的Sed命令_Bash_For Loop_Sed - Fatal编程技术网

Bash 带有变量的for循环中的Sed命令

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

我有一个名为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.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您应该根据问题更新问题,以准确显示您的输入和预期输出。就目前而言,它被简化得如此之多,以至于除此之外的任何解决方案都没有多大意义。