Sed替换最后一个逗号失败

Sed替换最后一个逗号失败,sed,Sed,我正在编写一个sed脚本,该脚本包含一系列行,并将它们转换为matlab的参数列表(单引号,逗号分隔) 到目前为止,它运行良好: [script to generate list] | sed -n "s#\(.*$\)#'\1',#p#" | tr '\n' ' ' 但这给我留下了一个逗号 通过测试,我可以用 [list of comma separated values] | sed -n 's#,$##p#' 但是,当把这一切放在一起时: [script to generate lis

我正在编写一个sed脚本,该脚本包含一系列行,并将它们转换为matlab的参数列表(单引号,逗号分隔)

到目前为止,它运行良好:

[script to generate list] | sed -n "s#\(.*$\)#'\1',#p#" | tr '\n' ' '
但这给我留下了一个逗号

通过测试,我可以用

[list of comma separated values] | sed -n 's#,$##p#'
但是,当把这一切放在一起时:

[script to generate list] | sed -n "s#\(.*$\)#'\1',#;s#,$##p#" | tr '\n' ' '
什么也不输出

我觉得它与sed脚本的第一行中没有p有关,但我不希望它打印这些值,我希望它们发送到脚本的下一行,这不是默认值吗

编辑: [生成列表的脚本]输出目录列表,例如:

./work/matlab_stun_gun/tex/fullTest.pdf
./Downloads/Howfar(tetra2) fixed.pdf
./work/savdocs/win_tests/tex/texReport.pdf
./Downloads/AcademicAudit.pdf
./work/matlab_stun_gun/report.pdf
./Downloads/PMB_4DVMC.pdf
./work/savdocs/win_tests/tex/mouseHeatMap.pdf
./Downloads/Geometry.pdf
./work/savdocs/win_tests/tex/mouseHeatMap.pdf
./work/matlab_stun_gun/tex/fullTest.pdf
列表生成器刚刚找到-name*.pdf | pickl-n10,根据文件类型/编号等进行了调整。这将成为一个通用脚本

预期产出将是:

'./work/savdocs/win_tests/tex/mClickss.pdf', './Downloads/Howfar(tetra2) fixed.pdf', './Downloads/MedPhys_defDOSXYZ.pdf', './Downloads/MedPhys_defDOSXYZ.pdf', './report.pdf', './work/savdocs/win_tests/tex/cSwitchs.pdf', './tex/zoomIn.pdf', './tex/fullTest.pdf', './temp/tex/zoomIn.pdf', './tex/zoomIn.pdf'

请注意缺少尾随逗号

您在这里遇到了一个多方面的问题,即您的每次尝试都有问题

从[list of comma separated values]| sed-n的$p开始,请记住tr有效地将分隔符改为“,”逗号空格,而不仅仅是“,”逗号。这意味着您将不会从第二个sed表达式中输出任何内容。您可以通过匹配sed-n的$p来解决这个问题。如果坚持使用-n标志,这是正确的解决方案。全文:

[script to generate list] | \
        sed -n "s#\(.*$\)#'\1',#p#" | \
        tr '\n' ' ' | \
        sed -n 's#, $##p#'
组合尝试的问题,[script to generate list]| sed-n s\.*$\'\1',;s、 $p | tr'\n''表示在删除尾部逗号之前需要应用tr。即使要打印任何内容,也要添加逗号,在每行上立即将其去掉,然后用空格替换换行符。上面已经显示了正确的顺序

应使用-e标志指定sed中的多个命令。它们将一个命令的结果通过管道传输到另一个命令,与使用管道相当,但效率更高。要获取sed-n s\.*$\'\1',请执行以下操作:,;s、 $p要打印,请将其改写为:

sed -n -e "s#\(.*$\)#'\1',#" -e "s#, $##p#"
当然,这会在您将逗号添加到每一行时立即去掉逗号,但它显示了正确的语法

进一步改进 您可能不需要为sed使用-n标志,因此也不需要为s命令使用/p/标志。只有当您只想打印匹配项,但想打印所有内容时,-n标志才有用,因此它不适用于您

您也不需要显式的捕获组,因为您可以使用\0替换来获取整个匹配,而不仅仅是组。以下是一个例子:

[script to generate list] | sed "s/.*/'\0'" | tr '\n' ' ' | sed 's/, $//'
最后,还有其他方法可以在不启动子进程的情况下删除字符串的尾随位,特别是因为您已经将表达式封装在$…:


为什么在tr命令后有parens?这是一个复制错误-整个东西都在$内。EditedAddExpected output为清晰起见..您忘记修复第二个。您的输入与输出不匹配:
RESULT=$([script to generate list] | sed "s/.*/'\0'" | tr '\n' ' ')
RESULT=${RESULT%, }
RESULT=${RESULT::-2}