sed未终止的“ s”命令修改文件行

时间:2019-12-12 09:50:30

标签: bash awk sed

我正在尝试修改groups.tsv文件(我在repl.it上,因此文件路径很好)。 文件中的每一行如下所示:

  

组名\ t人数\ t最后添加

我正在尝试计算groupname($nomgrp)login($login)的出现,并更改lastadded进行登录。

varcol2=$(grep "$nomgrp" groups | cut "-d " -f2- | awk -F"\t" '{print $2}' )
((varcol21=varcol2+1));
varcol3=$(awk -F"\t"  '{print $3}' groups)
sed  -i "s|${nomgrp}\t${varcol2}\t$varcol3|${nomgrp}\t${varcol21}\t${login}|" groups

但是,我收到错误消息:

  

sed:-e表达式#1,字符27:未终止的's'命令

groups文件中的行如" sudo 2 user1"(用制表符分隔):用户输入存储在"user"中的$login,然后输入存储在"sudo"中的$nomgrp php composer.phar update yiisoft/yii2-debug

我在做什么错?

对不起,如果已经解决了这个问题/超级容易解决,我是这里的新手...

1 个答案:

答案 0 :(得分:0)

如果我了解您要正确执行的操作,并且拥有GNU awk,则可以这样做

gawk -i inplace -F '\t' -v group="$nomgrp" -v login="$login" -v OFS='\t' '$1 == group { $2 = $2 + 1; $3 = login; } { print }' groups.tsv

示例:

$ cat groups.tsv
wheel   1000    2019-12-10
staff   1234    2019-12-11
users   9001    2019-12-12
$ gawk -i inplace -F '\t' -v group=wheel -v login=2019-12-12 -v OFS='\t' '$1 == group { $2 = $2 + 1; $3 = login; } 1' groups.tsv 
$ cat groups.tsv 
wheel   1001    2019-12-12
staff   1234    2019-12-11
users   9001    2019-12-12

其工作原理如下:

  • -i inplace是GNU awk扩展,允许您在适当的位置更改文件,
  • -F '\t'将输入字段分隔符设置为制表符,以便将输入解释为TSV,并且其中不包含空格的字段不会分开,
  • -v variable=name设置一个awk变量以在awk的代码中使用,
  • 具体来说,-v OFS='\t'将输出字段分隔符变量设置为制表符,以便输出再次为TSV

因此,我们将变量grouplogin设置为您的shell变量,并确保awk输出TSV。代码如下:

$1 == group {     # If the first field in a line is equal to the group variable
  $2 = $2 + 1;    # add 1 to the second field
  $3 = login;     # and overwrite the third with the login variable
}
{                 # in all lines:
  print           # print
}

{ print }也可以缩写为1,我敢肯定有人会指出,但是我发现这种方式更容易解释。

如果您没有GNU awk,则可以使用一个临时文件来实现相同的目的,例如

awk -F '\t' -v group="$nomgrp" -v login="$login" -v OFS='\t' '$1 == group { $2 = $2 + 1; $3 = login; } { print }' groups.tsv  > groups.tsv.new
mv groups.tsv.new groups.tsv