我查看了其他类似的问题,但答案对我没有帮助。我是 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)
您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从每个文件名中删除后缀的位。