我怎麼得到這個如何在報價中使用sed中的引號?
ls -1 | sed 's/\(.*\)/alias \1 "shot \1"/'
到別名?
例子:
alias asdf "ls -1 | sed 's/\(.*\)/alias \1 "shot \1"/'"
問題是,當我到了引號的別名。
我怎麼得到這個如何在報價中使用sed中的引號?
ls -1 | sed 's/\(.*\)/alias \1 "shot \1"/'
到別名?
例子:
alias asdf "ls -1 | sed 's/\(.*\)/alias \1 "shot \1"/'"
問題是,當我到了引號的別名。
像這樣:
alias asdf="ls -1 | sed 's/.*/alias & \"shot &\"/'"
你忘了賦值運算符(=
);要在雙引號內得到雙引號,你必須用\"
來轉義它們。
此外,我已將您的捕獲組和反向引用更改爲使用&
,即代表完整匹配。
請注意,以編程方式處理ls
的輸出是not recommended。例如,一個強大的解決方案將使用find
或fileglobs(如anubhava's answer),但問題的主要觀點是關於轉義雙引號。
您錯過了相同的符號,您必須使用雙引號。試試這個:
alias asdf="ls -1 | sed 's/\(.*\)/alias \1 \"shot \1\"/'"
假設你的文件名只包含字母,數字或點或下劃線,你應該避免解析的ls
輸出。 另一個缺陷是在您的命令中使用管道,這將只在子shell中創建alias
,而不是在當前shell中。
您可以使用此for
循環,而不是:
for f in *; do
alias $f="shot $f"
done
不要使用別名,使用函數:
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。
用\返回不匹配的轉義引號。 – user1869582