我有一个文件,里面有一行文本。不使用编辑器如何修改其内容vi
?
下面是示例:
PROCESS DATE =2014-08-01
我想将2014-08-01
日期增加到下一天。我的想法是创建一个变量。我怎样才能做到这一点?
答案1
你可以使用perl
:
perl -MTime::Piece -pi -e 's/\d{4}-\d\d-\d\d/
(Time::Piece->strptime($&,"%Y-%m-%d")+24*60*60)->date/ge' file
将增加文件中的每个日期。
答案2
我会写:
increment_date() {
local current=$(grep -oP 'PROCESS DATE =\K.+' file)
local next=$(date -d "$current + 1 day" +%F)
sed -i "/PROCESS DATE =/s/$current/$next/" file
}
cat file
increment_date
cat file
increment_date
cat file
PROCESS DATE =2012-02-28
PROCESS DATE =2012-02-29
PROCESS DATE =2012-03-01
这假设 PROCESS DATE 行仅在文件中出现一次,并且它单独占一行。
答案3
这取决于您需要的复杂程度。如果您需要的只是将 更改01
为 a 02
,您可以使用类似的东西
sed -i 's/01/02/' file
或者
perl -i -pe 's/01/02/' file
或者,为了安全起见,仅当 位于01
行尾时才执行此操作:
sed -i 's/01$/02/' file
perl -i -pe 's/01$/02/' file
由于该标志,上述两种解决方案都会修改原始文件-i
。
如果您需要能够考虑实际日期,例如递增2014-02-28
到2014-03-01
,则需要使用可以解析日期的成熟编程语言或使用以下命令date
:
$ while IFS='=' read -r text date; do
echo "$text=$(date -d "$date + 1 day" +%F)";
done < file > new_file
上面将分割输入行,将as=
之前的部分保存为,其余部分保存为。然后,将其输入命令,该命令可以执行奇特的日期操作,例如添加一天,然后以您想要的格式打印出来(在本例中,格式意味着)。请注意,这假定为 GNU 日期。=
$text
$date
$date
date
%F
Year-Month-Day
该echo
命令打印内容$text
,然后打印日期增加一天。如果=
文件的任何行上有多个行,此操作将会失败。
答案4
我自己的日期工具提供一个命令行工具dadd
,它可以遍历文本文件并向找到的每个日期添加一些内容:
$ dadd -S +1d FILE
PROCESS DATE =2014-08-02