我如何得到这个
ls -1 | sed 's/\(.*\)/alias \1 "shot \1"/'
成别名?
示例:
alias asdf "ls -1 | sed 's/\(.*\)/alias \1 "shot \1"/'"
问题是当我找到别名的引号时。
答案 0 :(得分:1)
不要使用别名,请使用函数:
my_func() {
ls -1 | sed 's/.*/alias & "shot &"/'
}
但是你应该avoid parsing the output of ls。请阅读链接!
在您的情况下,假设文件名中没有换行符,可以使用^ 0:
my_func() {
printf '%s\n' * | sed 's/\(.*\)/alias \1 "shot \1"/'
}
^ 0这会让你解决ls会遇到同样的问题,但是没有调用额外的进程,因为printf是buildin。
答案 1 :(得分:0)
像这样:
alias asdf="ls -1 | sed 's/.*/alias & \"shot &\"/'"
您忘记了赋值运算符(=
);要在双引号内获得双引号,您必须使用\"
转义它们。
此外,我已将您的捕获组和反向引用更改为使用&
,代表完全匹配。
请注意,以编程方式处理ls
的输出为not recommended。例如,一个强大的解决方案将使用find
或fileglobs(如anubhava's answer),但问题的主要内容是关于转义双引号。
答案 2 :(得分:0)
你错过了相同的符号,你必须逃避双引号。试试这个:
alias asdf="ls -1 | sed 's/\(.*\)/alias \1 \"shot \1\"/'"
答案 3 :(得分:0)
假设您的文件名只包含字母数字或DOT或下划线,则应避免解析ls
的输出。 在您的命令中使用管道的另一个缺陷是仅在子shell中创建alias
而不是在当前shell中。
您可以改为使用此for
循环:
for f in *; do
alias $f="shot $f"
done