我需要通过cron运行bash脚本来更新文件。 该文件是.DAT(类似于csv)并包含管道分隔值。 我需要在顶部插入标题行。
这是我到目前为止所拥有的:
#!/bin/bash
# Grab the file, make a backup and insert the new line
sed -i.bak 1i"red|blue|green|orange|yellow" thefilename.dat
Exit
但是如何将文件另存为不同的文件名,以便始终使用fileA,对其进行编辑然后将其另存为fileB
答案 0 :(得分:3)
你真的将旧版本重命名为xxx.bak还是只保存一份新副本?
无论哪种方式,只需使用重定向。
sed 1i"red|blue|green|orange|yellow" thefilename.dat > newfile.dat
或者如果你想要.bak
sed 1i"red|blue|green|orange|yellow" thefilename.dat > newfile.dat \ && mv thefilename.dat thefilename.dat.bak`
会创建你的新文件,然后,只有当sed成功完成后,重命名orig文件。
答案 1 :(得分:1)
如果有人发现它有用,这就是我最终做的......
抓取原始文件,将其转换为所需的文件类型,同时插入新的标题行并记录下来。
#!/bin/bash -l
####################################
#
# This script inserts a header row in the file $DAT and resaves the file in a different format
#
####################################
#CONFIG
LOGFILE="$HOME/bash-convert/log-$( date '+%b-%d-%y' ).log"
HOME="/home/rootname"
# grab original file
WKDIR="$HOME/public_html/folder1"
# new location to save
NEWDIR="$HOME/public_html/folder2"
# original file to target
DAT="$WKDIR/original.dat"
# file name and type to convert to
NEW="$NEWDIR/original-converted.csv"
####################################
# insert a new header row
HDR="header-row-1|header-row-2|header-row-2 \r"
# and update the log file
{
echo "---------------------------------------------------------" >> $LOGFILE 2>&1
echo "Timestamp: $(date "+%d-%m-%Y: %T") : Starting work" >> $LOGFILE 2>&1
touch "$LOGFILE" || { echo "Can't create logfile -- Exiting." && exit 1 ;} >>"$LOGFILE"
# check if file is writable
sudo chmod 755 -R "$NEW"
echo "Creating file \"$NEW\", and setting permissions."
touch "$NEW" || {
echo "Can't create file \"$NEW\" -- Operation failed - exiting" && exit 1 ;}
} >>"$LOGFILE" 2>&1
{
echo "Prepending line \"$HDR\" to file $NEW."
{ echo "$HDR" ; cat "$DAT" ;} > "$NEW"
{
if [ "$?" -ne "0" ]; then
echo "Something went wrong with the file conversion."
exit 1
else echo "File conversion successful. Operation complete."
fi
}
} >>"$LOGFILE" 2>&1
exit 0
答案 2 :(得分:0)
我发现更清晰的语法是在“插入”模式的两个单引号之间使用“ i”表示一致。
您可以简单地添加标题,然后使用以下方法将其保存在其他文件中:
sed '1i header' file > file2
在您的情况下:
sed '1i red|blue|green|orange|yellow' file > file2
如果要将其保存在同一文件中,请使用-i
选项:
sed -i '1i red|blue|green|orange|yellow' file