【问题标题】:sed unterminated 's' command modify line of filesed unterminated 's' 命令修改文件行
【发布时间】:2023-04-09 09:49:01
【问题描述】:

我正在尝试修改 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 expression #1, char 27: unterminated 's' command

组文件有诸如" sudo 2 user1" 之类的行(用制表符分隔):用户输入"user" 存储在$login 中,然后"sudo" 存储在$nomgrp 中。

我做错了什么?

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

【问题讨论】:

  • 可能其中一个变量包含| 字符。尝试其他分隔符。
  • 尝试使用 _ ; / 和 \ 。它们都不起作用
  • @aveillon,如果您可以在有关输入样本和预期输出样本的问题中告诉我们,这将有助于我们在这里为您提供更多帮助。请编辑您的问题,然后告诉我们。
  • 通过输入编辑了我的问题,希望对您有所帮助,如果您需要,请随时询问

标签: bash awk sed


【解决方案1】:

如果我理解您正在尝试正确执行的操作,并且您有 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

【讨论】:

    猜你喜欢
    • 2012-05-29
    • 2021-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-23
    • 2016-07-29
    • 2021-12-01
    相关资源
    最近更新 更多