我有一个文本文件,我想通过ksh脚本更新(只想“插入”)。我想以正确的顺序插入文本;但是,目前并不存在所有的值。
我的文本文件将包含如下数据:
## This file is used for ...
##
## The user below belongs to Training 13:
99 TNG13
## The user below belongs to Training 21:
14 TNG21我的计划是让ksh脚本创建要插入到tmp文件中的文本:
## This user below belongs to Training 17:
12 TNG17我猜我会使用sed或awk来查找地点,并使用
我的问题是,我需要找到包含TNG条目的部分,找到我的新条目所属的位置,然后插入新数据。我不能对整个数据进行排序,因为我需要实际数据之上的注释才能与数据保持一致!在本例中,我想在添加TNG17的TNG13 entry...since之后插入我的数据。( TNGXX前面的数字是随机的,对于识别需要的行没有实际的用处)
感谢您所能提供的任何帮助!
KSL。
更新:
我想出了一个解决方案,也许不是最干净的!我可以看到两种情况,这个解决方案会有问题: 1.如果我试图更新的条目是"TNG1“,因为它将没有引用!2.如果我试图更新的条目在注释行中有TNGxx。
我的ksh解决方案(到目前为止):
myid = `echo $USERNAME|cut -c4-6`
tng_id = $myid
while [[ $tng_id > 0 ]]
do
grep tng$tng_id $file1 > /dev/null
if [ #? = '0' ]; then
PATTERN = "tng$tng_id"
echo "Creating entry after $PATTERN"
sed -I "/$PATTERN/a \\ \n# Creating entry for tng$myid" $file1"\n
break
fi
(( $tng_id-- ))
done发布于 2014-04-24 04:38:24
您可以尝试以下perl脚本:
#! /usr/bin/perl
use v5.14;
use autodie;
$/="";open(my $fh,"<",shift);my @a=<$fh>;close($fh);
$/=undef;open($fh,"<",shift); my $temp=<$fh>;close($fh);
my $pat=qr/^\d+\s+TNG(\d+)/m;
my ($key)=$temp=~$pat;
my @ind=grep($a[$_]=~ $pat,0..$#a);
my $ii; my $found=0;
for (@ind) {
my ($keyi)=$a[$_]=~$pat;
$ii=$_;
if ($keyi>$key) {
$found=1; $temp.="\n";
last;
}
}
if (!$found) {
$ii=$ii+1; $temp="\n".$temp;
}
splice(@a,$ii,0,$temp);
print join("",@a);作为./p.pl file tmp.txt从命令行运行它,其中file是您的文本文件,tmp.txt是临时文件。
发布于 2014-05-07 03:54:16
我以为这里已经关门了。就我而言,下面的解决方案效果最好。
我的ksh解决方案(到目前为止):
myid = `echo $USERNAME|cut -c4-6`
tng_id = $myid
while [[ $tng_id > 0 ]]
do
grep tng$tng_id $file1 > /dev/null
if [ #? = '0' ]; then
PATTERN = "tng$tng_id"
echo "Creating entry after $PATTERN"
sed -I "/$PATTERN/a \\ \n# Creating entry for tng$myid" $file1"\n
break
fi
(( $tng_id-- ))
done谢谢。KSL>
https://stackoverflow.com/questions/23253359
复制相似问题