字符串使用Sed或Awk替换

时间:2014-10-13 12:01:13

标签: regex shell sed regex-lookarounds awk-formatting

Cat vols.txt(此列表可能会根据系统可能具有的值而波动)

$Vol01
$Vol02
$Vol03
$Vol04
$Vol04
$Vol05
$Vol06
$Vol07
$Vol08

如果我这样做:

cat datavols.log | sed -n 's/^\$.*/vanish \\&\.acd\*\.\* -db ! \&/gp' >> workfile.txt

我明白了:

cat workfile.txt

vanish $Vol01.acd*.* -db ! &
vanish $Vol02.acd*.* -db ! &
vanish $Vol03.acd*.* -db ! &
vanish $Vol04.acd*.* -db ! &
vanish $Vol05.acd*.* -db ! &
vanish $Vol06.acd*.* -db ! &
vanish $Vol07.acd*.* -db ! &
vanish $Vol08.acd*.* -db ! &

我有4个CPU,我想在它们之间分配工作,输出应该是这样的:

cat workfile.txt

Run –cpu=0 vanish $Vol01.acd*.* -db ! &
Run –cpu=1 vanish $Vol02.acd*.* -db ! &
Run –cpu=2 vanish $Vol03.acd*.* -db ! &
Run –cpu=3 vanish $Vol04.acd*.* -db ! &
Run –cpu=0 vanish $Vol05.acd*.* -db ! &
Run –cpu=1 vanish $Vol06.acd*.* -db ! &
Run –cpu=2 vanish $Vol07.acd*.* -db ! &
Run –cpu=3 vanish $Vol08.acd*.* -db ! &

请帮我解决这个问题。我不知道如何在SED内的0-3之间进行变量迭代。提前谢谢。

5 个答案:

答案 0 :(得分:2)

 awk 'BEGIN{i=0}{print "Run –cpu="i " vanish "$1".acd*.* -db ! &"; i=(i+1)%4}' inputfile

将产生输出

 Run –cpu=0 vanish $Vol01.acd*.* -db ! &
Run –cpu=1 vanish $Vol02.acd*.* -db ! &
Run –cpu=2 vanish $Vol03.acd*.* -db ! &
Run –cpu=3 vanish $Vol04.acd*.* -db ! &
Run –cpu=0 vanish $Vol05.acd*.* -db ! &
Run –cpu=1 vanish $Vol06.acd*.* -db ! &
Run –cpu=2 vanish $Vol07.acd*.* -db ! &
Run –cpu=3 vanish $Vol08.acd*.* -db ! &

答案 1 :(得分:2)

您可以在FNR中使用awk文件的当前行号:

awk '{print "Run -cpu=" (FNR-1)%4 " vanish " $0 ".acd*.* -db | &"}' vols.txt

答案 2 :(得分:1)

您也可以使用这个简单的bash script

Total_Cpu=4
Count=0
while read line ; do
   if [ $Count  -eq  4 ] ;then
      Count=0
   fi
    echo $line | sed "s/^\$.*/Run –cpu=$Count vanish \&.acd*.* -db ! \&/g" >> Output_file
    Count=`expr $Count + 1`         
done < Input_File

答案 3 :(得分:1)

这可能适合你(GNU sed):

sed -rn '1{x;s/^/0123/;x};G;s/(.*)\n(.)(.*)/Run -cpu=\2 vanish \1.acd*.* -db ! \&\n\3\2/;P;s/.*\n//;h file

创建一个包含所需cpu序列的行,并将其存储在保留空间(HS)中。

将HS附加到当前行,并使用substitute命令插入cpu编号和所需的字符串,为下一行准备cpu顺序。

打印字符串,然后替换HS中的修改后的cpu顺序。

答案 4 :(得分:1)

sed '1 {
   x;s/^/Run –cpu=3 vanish :-D.acd*.* -db ! \&/;x
   }
x;y/0123/1230/;G;s/\(.*sh \)[^.]\{1,\}\(.*\)\n\(.*\)/\1\3\2/;h' YourFile

有点像potong bt使用最后一行作为上一个参考只更改$ vol内容和cpu值