未终止的`s'命令

Fil*_*ová 0 bash sed

我查看了其他类似的问题,但答案对我没有帮助。我是 bash 新手,我的脚本中可能有语法错误,但我不知道在哪里。每次运行此脚本时,我都试图更新 example.conf 文件中的用户。每个用户都有一个 name.pub 文件。

VAR1=$( ls  | grep ".pub" |sed "s/.pub//g")
VAR2="@demo_project_users = "
res=$VAR2$VAR1
sed  "s/@demo_project_users = .*/$res/g" example.conf
Run Code Online (Sandbox Code Playgroud)

这正在产生Unterminated 's' command错误。

编辑:我在一个文件夹中有这些文件

aaaaaaaaaa.pub  eboh.pub      get_usernames.sh  mmusterfrau.pub  plom.pub   rrein.pub  update_users.sh
dboh.pub        example.conf  leni.pub          mmustermann.pub  rcall.pub  tani.pub
Run Code Online (Sandbox Code Playgroud)

我想将所有用户名(不带 .pub)排成一行,中间有一个空格,就像这样

@demo_project_users = (... all  names here)
Run Code Online (Sandbox Code Playgroud)

Kus*_*nda 5

grep可能匹配多个文件名,它给出了一个$res包含换行符的值。sed当使用包含文字换行符的替换字符串时,GNU会完全按照您描述的方式抱怨。

不要grep用于过滤ls. 如果要获取当前目录中与模式匹配的所有名称*.pub,请使用

filenames=( *.pub )
Run Code Online (Sandbox Code Playgroud)

这将创建一个包含与给定模式匹配的所有名称的数组。

然后:

sed 's/\(@demo_project_users = \).*/\1'"${filenames[*]%.pub}"'/g' example.conf
Run Code Online (Sandbox Code Playgroud)

"${filenames[*]%.pub}"膨胀将扩大到由每个在文件名中的一个字符串filenames数组,由空格(或任何第一字符分隔$IFS恰好是;默认情况下的空间),并以后缀串.pub从每一个中移除。

"${filenames[*]}"是扩展为空格分隔的字符串的%.pub位,也是.pub从每个文件名中删除后缀的位。