最初的回答:使用 awk 时,您永远不需要 sed。给定此输入文件:
当您使用 awk 时,不需要使用 sed。给定以下输入文件:
$ cat file
sctl sudo systemctl # here is a comment
# and here is another
pac sudo pacman
svu playerctl -p spotify volume +0.05
以下是你的sed+awk输出结果:
最初的回答:
$ sed "s/\s*#.*$//;/^\s*$/d" file | awk -v c="abbr" -v o=" " '{ print c" "$1""o"\""$2" "$3"\"" }'
abbr sctl "sudo systemctl"
abbr pac "sudo pacman"
abbr svu "playerctl -p"
你可以仅使用awk获得它的最初回答。
$ awk -v c="abbr" -v o=" " '{sub(/\s*#.*/,"")} NF{print c" "$1""o"\""$2" "$3"\""}' file
abbr sctl "sudo systemctl"
abbr pac "sudo pacman"
abbr svu "playerctl -p"
最初的回答是,您可以调整它以实现您想要的功能:
并使其符合您的需求:
$ awk -v c="abbr" -v o=" " '{sub(/\s*#.*/,"")} NF{x=$1; sub(/^\S+\s+/,""); $1=$1; print c, x o "\"" $0 "\""}' file
abbr sctl "sudo systemctl"
abbr pac "sudo pacman"
abbr svu "playerctl -p spotify volume +0.05"
"最初的回答":根据你的问题,我无法确定你想在双引号内外要什么。
$ awk -v c="abbr" -v o=" " '{sub(/\s*#.*/,"")} NF{x=$1" "$2; sub(/^(\S+\s+){2}/,""); $1=$1; print c, x o "\"" $0 "\""}' file
abbr sctl sudo "systemctl"
abbr pac sudo "pacman"
abbr svu playerctl "-p spotify volume +0.05"
以上代码使用GNU awk的\s
和\S
- 对于其他awk使用[[:space:]]
和[^[:space:]]
代替。
由于我们正在使用GNU awk,因此可以使用match()的第三个参数更简洁、高效地完成工作:
原始答案:Original Answer
$ awk -v c="abbr" -v o=" " '{sub(/\s*#.*/,""); $1=$1} match($0,/(\S+) (.*)/,a){print c, a[1] o "\"" a[2] "\""}' file
abbr sctl "sudo systemctl"
abbr pac "sudo pacman"
abbr svu "playerctl -p spotify volume +0.05"
$ awk -v c="abbr" -v o=" " '{sub(/\s*#.*/,""); $1=$1} match($0,/(\S+ \S+) (.*)/,a){print c, a[1] o "\"" a[2] "\""}' file
abbr sctl sudo "systemctl"
abbr pac sudo "pacman"
abbr svu playerctl "-p spotify volume +0.05"
aliases
文件并在.bashrc
中引用它。建议创建单独的块来测试if [ "$UID" -eq '0' ]; then alias pms='pacman -S --needed'; alias pmsu='pacman -Syu'; ... else alias pms='sudo pacman -S --needed'; alias pmsu='sudo pacman -Syu'; ... fi
- David C. Rankin