Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.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
Linux 用于在目录中的多个文件中用当前日期动态替换旧日期的Unix脚本_Linux_Shell_Unix - Fatal编程技术网

Linux 用于在目录中的多个文件中用当前日期动态替换旧日期的Unix脚本

Linux 用于在目录中的多个文件中用当前日期动态替换旧日期的Unix脚本,linux,shell,unix,Linux,Shell,Unix,我正在尝试编写一个脚本,其中它是一个*分隔的文件,有多行以DTP开头。我想将日期部分替换为子字符串,并与今天的日期进行比较。如果它比今天旧,我想用今天的日期替换它。这里有一个例子 $ cat temp.txt RTG*888*TD8*20180201-20180201~ TWW*888*RD8*20180201-20180201~ RTG*888*TD8*20180201-20180201~ KCG*888*TD8*20180201-20180201~ 我希望通过更改日期获得如下输出。请帮忙。

我正在尝试编写一个脚本,其中它是一个*分隔的文件,有多行以DTP开头。我想将日期部分替换为子字符串,并与今天的日期进行比较。如果它比今天旧,我想用今天的日期替换它。这里有一个例子

$ cat temp.txt
RTG*888*TD8*20180201-20180201~
TWW*888*RD8*20180201-20180201~
RTG*888*TD8*20180201-20180201~
KCG*888*TD8*20180201-20180201~
我希望通过更改日期获得如下输出。请帮忙。我正在寻找UNIX脚本,使其适用于该目录中的所有文件

RTG*888*TD8*20190424-20190424~
TWW*888*RD8*20180201-20180201~
RTG*888*TD8*20190424-20190424~
KCG*888*TD8*20180201-20180201~

提前感谢

考虑到您的文件将不会有未来的日期(根据您的示例看起来是这样的),如果是这种情况,请尝试

awk -v dat="$(date +%Y%m%d)" '
BEGIN{
  FS=OFS="*"
}
{
  split($4,array,"[-~]")
  if(array[1]!=dat){
    array[1]=dat
  }
  if(array[2]!=dat){
    array[2]=dat
  }
  $4=array[1]"-"array[2]"~"
}
1'   Input_file

下面将在使用Bash和GNU的date实用程序的系统上工作。让我们使用“while read”循环执行一个简单的脚本:

#逐行读取文件,字段之间用空格分隔*
而IFS='*'读取-r str1 num str2 date;做
#如果第一个字段是RTG
如果[“$str1”=“RTG”];然后
#然后用当前日期字符串替换日期
curdate=$(日期+%Y%m%d)
date=“${curdate}-${curdate}”
fi
#打印输出
printf“%s*%s*%s*%s\n”“$str1”“$num”“$str2”“$date”
#在while read循环中-输入文件为
#已重定向到末尾的标准输入
完成
请修改您提供的脚本以处理目录中的所有文件。那将对我很有帮助

#用于当前目录中的所有条目(使用bash球状化设置(!)
以*存档;做
#检查它是否是一个文件
如果[!-f“$file”];然后
#如果没有,下一个条目是什么
继续;
fi
#运行脚本
而IFS='*'读取-r str1 num str2 date;做
如果[“$str1”=“RTG”];然后
curdate=$(日期+%Y%m%d)
date=“${curdate}-${curdate}”
fi
printf“%s*%s*%s*%s\n”“$str1”“$num”“$str2”“$date”
完成<“$file”
完成

到目前为止,您尝试了什么?还有,为什么
TWW*888*RD8*20180201-20180201 ~
KCG*888*TD8*20180201-20180201 ~
中的日期没有被替换?我是unix的新手。所以我无法准备脚本。仅以RTG开头的行应替换为当前日期。很难说代码出了什么问题,因为您没有提供代码或遇到了错误。还有,宾果。。。!它在Kamil Cuk的工作如预期。。但是如何为特定目录中的所有文件执行脚本,请提供帮助。例如:
for file in specificulardirectory/*;当IFS='*'读取时执行。。。。。。。完成<“$file”;完成
。或者
IFS='\n'文件=($(find specialdirectory-type f));对于“${files[@]}”中的文件;趁。。。。。完成嘿kamil,如果我想替换日期部分为当前日期减去(-)15天,而不比较文件中的现有日期。如何做。你能帮我修改一下吗?所以请继续阅读文档,具体说明。我认为
date'-date=-15days'
可以打印日期减去15个日期。请阅读“在日期以下获取错误:非法选项”--用法:日期[-u][+字段描述符]
# read the file line by line with fields separated by *
while IFS='*' read -r str1 num str2 date; do
    # if the first field is RTG
    if [ "$str1" = "RTG" ]; then
        # then substitute date with current date string
        curdate=$(date +%Y%m%d)
        date="${curdate}-${curdate}~"
    fi
     # print the output
    printf "%s*%s*%s*%s\n" "$str1" "$num" "$str2" "$date"
# in while read loops - the input file is 
# redirected to standard input on the end
done < file.txt
# for all entries in current directory (uses bash globulation settings(!))
for file in *; do
   # check if it's a file
   if [ ! -f "$file" ]; then
        # if not, next entry
        continue;
   fi

   # run the script
   while IFS='*' read -r str1 num str2 date; do
        if [ "$str1" = "RTG" ]; then
            curdate=$(date +%Y%m%d)
            date="${curdate}-${curdate}~"
        fi
        printf "%s*%s*%s*%s\n" "$str1" "$num" "$str2" "$date"
    done < "$file"

done