如果参数列表太长如何处理 sed

如果参数列表太长如何处理 sed

尝试应用以下命令:

sudo sed -i "s/auth-user-pass/auth-user-pass pass.txt/g" *.ovpn

但我不断收到以下错误:

sudo: unable to execute /bin/sed: Argument list too long

我要搬到吗xargs

答案1

xargs变体使用find

find . -maxdepth 1 -type f -name '*.ovpn' \
    -exec sed -i 's/auth-user-pass/auth-user-pass pass.txt/g' {} +

这将sed在尽可能大批量的文件名上执行您的命令(仅限常规文件,没有匹配的目录名等),文件名与当前目录中的给定模式匹配(仅)。它还可以处理潜在的奇怪文件名(空格、换行符等)

选项-maxdepth/谓词不是标准的,但经常实现。

答案2

是的,一起走xargs才是正确的路。

简单的情况是

echo *.ovpn | xargs sed -i 's/auth-user-pass/auth-user-pass pass.txt/g'

但它仅适用于名称不包含空格的文件。安全的方法是

printf '%s\0' *.ovpn | xargs -0 sed ...

如果您不想将整个管道运行为root,请指定sudobeforexargs或 before sed

相关内容