V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  wxf666  ›  全部回复第 17 页 / 共 27 页
回复总数  522
1 ... 13  14  15  16  17  18  19  20  21  22 ... 27  
@Jirajine

> xonsh 就是个玩具

xonsh 大概有啥不足呢?我只匆匆看过一眼,没用过


> rename 用 $1 $2 来引用 capture group ,是自己的语言,不是 shell 的

用的是 pcre 吧。sed 也类似(但用的是 posix bre ere )

他们作为字符串传递,本来就和 shell 没啥关系呀

胶水语言就是这样咯,用最基础的 shell 语法,来描述要用人家的啥东西。。

我觉得你那个 elvish 应该也类似,golang 的正则库支持特性不多( regex101 说的)

想用一些高级特性(如 \p{Han}、a*?、a*+、(?>...)、(?<=...)、(?R)、(?(DEFINE)...) 等),就要导入其他库使用,甚至有自己的语法,不和 golang 未来的正则库兼容

这时候会不会就有人说 elvish 号称一致性,实际有多套正则语法,互不兼容,心智负担……


> 用 shell 构建另一个语言的字符串,你得考虑 shell 的转义(单引号或$符号)、dsl 的转义( /符号)、正则特殊字符的转义

shell 的转义:'$p $a $t \t \e \r \n' 都没问题啊(除了有 ' 字符时,需要用 'aaa'\''bbb' 表示)

dsl 的转义:那就看你那个工具的设计好不好咯。sed perl rename 可以用其他符号的:s|http://|https://|

正则特殊字符的转义:这个就是正则的问题了。golang 应该一样要面对


> glob 又是一套类似正则,但又不同的匹配语言

bash 的 glob ,也就 [] ? * {} 之类几个简单的语法吧,比正则简单得多

另外,我瞅了一眼,elvish 也是另外一套语法,且有点繁杂。。

bash:*.[ch]、[a-z].go

elvish:*.?[set:ch]、?[range:a-z].go


> 引用变量总是需要 quoting 。用 shell 处理包含空格的字符串简直是 nightmare

Emm... "$s" 不至于是 nightmare 吧。。


> 你要传多个参数,直接用 list 就行了

其实 bash 也支持 数组 和 哈希 呀。传多个参数,也可以直接用 数组:ls "${array[@]}"


> 你要传多个参数,直接用 list 就行了

我好奇 elvish 如何将 一个命令的返回值,split 成多个参数,传递给另一命令?如:

apt purge $(dpkg -l | grep ^rc | awk '{print $2}')
2022-09-05 11:13:45 +08:00
回复了 particlec 创建的主题 问与答 遇到一个柯里化的问题,感到困惑,请求大佬解惑
@particlec curryingAdds.length 换成 arguments.length
@Jirajine

> 用 elvish ,……,也比 Python 方便

直接和 Python 比不公平吧。。

后者定位是脚本语言,你前者拿来当交互式 shell 用的。。

Python 也有个 shell 实现,xonsh ,你试过吗?感觉咋样?


> 长正则,可读性差,有人看不懂

看各人咯,不想写正则,多半也是自己写代码,模拟实现了正则的逻辑出来

可能写的多了后,厌烦了,也会转正则那边去了


> rename 自己又有一种 dsl 语言

你是说很多命令有自己风格的正则嘛?

确实是个问题。但好像也就几种风格:posix bre ere 、pcre

\d 不支持就试试 [0-9] 或 [[:digit:]] 呗。反正支持的正则特性都差不多


> shell rename 转义,glob

shell 里用 'pattern' 来表达 rename 的正则,也没啥麻烦吧

glob ?*.jpg ?有啥问题么。。


> word splitting 可不是简短,是历史包袱

我觉得 bash 为实现下列功能,整体花费的代价很小。elvish 是如何实现的?

1. 变量 /subshell 捕获,被 split 成多个参数( bash:$s ,$(xxx))

2. 被作为一个参数传递( bash:"str: $s","captured: $(xxx)")


> man zshexpn 看一看特殊语法,字符串处理有多麻烦

我只用过 bash ,没用过 zsh 。bash 支持的字符串处理确实不多


> PowerShell 才是故意搞得冗长、难以输入并美其名曰“可读性”的

反正那人坚持说 powershell 因为冗长而强大。bash 简短易出错,容易友尽、吃牢饭等。。

另一个人说 shell 命令简短,容易记混 ln ls ll du dd df ……
@Jirajine 另外,你那个示例的逻辑,可以写成:rename 's/[^\dxX]//g; s/$/.jpg/' *


我觉得,交互式下的 shell ,简短快捷,还是很重要的吧

word splitting 、特殊语法 也是为这个目的服务的

不搞这些,就不可避免地会写长


简短 和 美观,感觉不可兼得,就看个人喜好了

反正交互式下,我是愿意阅读 bash 规则,牺牲一定可读性,来换取输入时的便捷的


就好比有人会放弃易读的拼音,练习五笔,去换取快捷打字一样(我折中一下,学了个双拼。。)
@Jirajine 我感觉你那个示例。。我更愿意写一行 rename + 正则。。
@Jirajine 这个为啥又比 bash 顺手了?

上次有人说 powershell (在交互式下)比 bash 强大,是因为参数显式,严谨安全。。
也对,名字里没有 0-9 x X ,直接 's/^.*?(\d+[\dxX]).*?(\.[^.]+)$/$1$2/' 就好
这样?

rename -n -v 's/^\s*.*?\s*(\d+[\dxX])\s*.*?(\.[^.]+)$/$1$2/' *

一样,确定没问题就去掉 -n 参数
2022-09-03 23:18:41 +08:00
回复了 automation2022 创建的主题 Python 自动化抓取 stackoverflow 问题列表
@BeautifulSoap 哇,第一次知道 StackOverflow 居然提供全站数据下载。。好开放啊

@Nillouise 有现成的大型数据库你可以用了
2022-09-03 15:33:41 +08:00
回复了 pepi 创建的主题 程序员 PowerShell 这种强大的命令行工具,为什么使用的人很少?
@documentzhangx66 你都说那个风险可能导致坐牢,开个 IDE 写个几行几十行 Python Ruby 啥的,代价也不算高吧
2022-09-02 19:55:48 +08:00
回复了 Messiahhh 创建的主题 程序员 分享一个命令行下载轻小说的工具
做成了个命令行客户端的样子
2022-09-02 18:42:12 +08:00
回复了 974879409 创建的主题 程序员 四年前端,聊聊这一行的体会...
@kop1989smurf 你是说,核心是“上级是如何思考出这个安排的”?还是啥?
2022-09-02 17:55:04 +08:00
回复了 pepi 创建的主题 程序员 PowerShell 这种强大的命令行工具,为什么使用的人很少?
@documentzhangx66 这样的需求,Python 等脚本语言,应该更适合?

别说参数了,连语法都有专业 IDE 实时检查,还能逐步调试等
2022-09-02 12:43:09 +08:00
回复了 baobaoyinshen 创建的主题 SQL Server 请教一下获取最后一次数据的 sql 写法
这样?

SELECT MAX(添加时间)
FROM xxx
GROUP BY 用户 ID, 设备号

『以 用户 ID and 设备号 为并且条件』是啥。。读不懂。。
2022-09-02 09:07:48 +08:00
回复了 ponelyr 创建的主题 游戏开发 一个《纯文字挂机类上班养成型游戏》想法梳理
以前的 wap 版游戏?还是 mud ?(听说过,没玩儿过,应该和 wap 不是同一类吧)
2022-09-02 08:56:13 +08:00
回复了 pepi 创建的主题 程序员 PowerShell 这种强大的命令行工具,为什么使用的人很少?
@smallthing 在写复杂脚本时,我也认为 Linux Shell 很丑陋


但在交互式下,你觉得 PowerShell 的优势是啥呢?

- 是和 105 楼说的那样,参数写得明显直白,能减少出错,更加安全?

- 还是 36 楼说的,Linux Shell 命令太短,很容易不理解 ln ls ll du dd df 什么意思?
2022-09-02 00:38:13 +08:00
回复了 mylifcc 创建的主题 Python 怎么才能在 Python 中输出一个 key 不带引号的字典呢
@mylifcc 28 楼有个小地方写错了,

{k: f'\\{v}' for k, v in zip('\b\t\n\f\r\\"', 'btnfr"\\')}

改成

{k: f'\\{v}' for k, v in zip('\b\t\n\f\r\\"', 'btnfr\\"')}
2022-09-02 00:30:51 +08:00
回复了 mylifcc 创建的主题 Python 怎么才能在 Python 中输出一个 key 不带引号的字典呢
@JamesMackerel
@llsquaer
@mylifcc

尝试用正则实现了,可在 regexr.com regex101.com 运行

1. 可以是数字、布尔、空值、字符串、列表、字典的随意组合

2. 除了字典的键会直接字符串化外,其他字符串会遵循 json 的要求,不包含控制字符和 \ "(替换为转义字符或十六进制)


以前写过『用正则去除 不规则 json 中的末项逗号』(如:[1, 2, 3,]),想着拿来改改就好

发现功力不够,必须要用到 (?>...) 特性,来防止回溯(即,碰到 \ 就一定要继续匹配后面的转义字符)

但这也导致 JavaScript 、Golang 、Python 3.10 及以下版本 无法使用( Python 3.11 开始支持了)


正则:"((?:(?>\\?).)*?)"\s*(:)|("(?:\\?.)*?")
替换:$1$2$3
引擎:PCRE


『例子( v 站排版原因,行首有若干全角空格,但不影响)』

[
  "\"fake_key\": value",
   123, true, false, null,
  {
    "key1" : "\n\\\":,]:\\",
    "key2" : "\n\\\":,}:\\",
  },
]


『替换后』

[
  "\"fake_key\": value",
   123, true, false, null,
  {
     key1: "\n\\\":,]:\\",
     key2: "\n\\\":,}:\\",
  },
]
2022-09-01 22:35:52 +08:00
回复了 mylifcc 创建的主题 Python 怎么才能在 Python 中输出一个 key 不带引号的字典呢
@mylifcc 这个应该是 js 的对象(字面量)吧: https://zh.javascript.info/object


试着写了一个( v 站排版原因,行首有若干全角空格):

1. 可以是数字、布尔、空值、字符串、列表、字典的随意组合

2. 除了字典的键会直接字符串化外,其他字符串会遵循 json 的要求,不包含控制字符和 \ "(替换为转义字符或十六进制)


from typing import Sequence, Mapping

ESCAPE_TABLE = str.maketrans(
  {chr(i): f'\\u{i:04x}' for i in range(32)} |
  {k: f'\\{v}' for k, v in zip('\b\t\n\f\r\\"', 'btnfr"\\')}
)

def jsonify(obj) -> str:
   if isinstance(obj, str):
     return f'"{obj.translate(ESCAPE_TABLE)}"'
   elif isinstance(obj, Sequence):
     return f"[{', '.join(map(jsonify, obj))}]"
   elif isinstance(obj, Mapping):
     return f"{{{', '.join(f'{k}: {jsonify(v)}' for k, v in obj.items())}}}"
   else:
     return str({
       None: 'null',
       True: 'true',
       False: 'false',
    }.get(obj, obj))
1 ... 13  14  15  16  17  18  19  20  21  22 ... 27  
关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5339 人在线   最高记录 6543   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 37ms · UTC 01:16 · PVG 09:16 · LAX 18:16 · JFK 21:16
Developed with CodeLauncher
♥ Do have faith in what you're doing.