gpt4 book ai didi

linux - 翻译一行的一部分

转载 作者:IT王子 更新时间:2023-10-29 01:10:35 25 4
gpt4 key购买 nike

我有一堆文件要从一个 wiki(基于 Markdown)移动到另一个(基于 Creole)。我写了几个 sed 脚本来转换链接格式和标题格式。但是新的 wiki 允许目录结构,我宁愿使用它也不愿使用我现在拥有的伪目录结构。我已经重命名了文件,但我需要将所有链接从 _ 分隔转换为 / 分隔。

基本信息:

Creole link: [[url]] [[url|name]]

我只想转换不包含 ./ 的链接。

如果您能解释一下您给出的命令的含义,我将不胜感激,以便我可以从中学习。


示例

this is a line with a [[Link_to_something]] and [[Something_else|something else]]
this site is cool [[http://example.com/this_page]]

this is a line with a [[Link/to/something]] and [[Something/else|something else]]
this site is cool [[http://example.com/this_page]]

我尝试过的

y/// 只适用于整行。

s//\u\2 只支持大小写翻译。

最佳答案

我想我会使用 Perl。它可以作为一行完成,因此:

perl -pe 's{\[\[([^/.|]+)(|[^]]+)?\]\]}{$x=$1;$y=$2;$x=~s%_%/%g;"[[$x$y]]"}gex;' <<'EOF'
this is a line with a [[Link_to_something]] and [[Something_else|something else]]
this site is cool [[http://example.com/this_page]]
EOF

输出是:

this is a line with a [[Link/to/something]] and [[Something/else|something else]]
this site is cool [[http://example.com/this_page]]

这是否是好的风格等完全可以讨论。

我将解释这个版本的代码,它与上面的代码同构:

perl -e 'use strict; use warnings;
while (my $line = <>)
{
$line =~ s{ \[\[ ([^/.|]+) (|[^]]+)? \]\] }
{ my($x, $y) = ($1, $2); $x =~ s%_%/%g; "[[$x$y]]" }gex;
print $line;
} '

while 循环基本上是 -p 在第一个版本中提供的。我明确地将输入变量命名为 $line,而不是像第一个版本那样使用隐式的 $_。我还必须声明 $x$y 因为 use strict;使用警告;

替换命令采用 s{pattern}{replace} 形式,因为正则表达式本身有斜线。 x 修饰符允许在两部分中使用(无关紧要的)空格,这样更容易布局。 g 修饰符在模式匹配时重复替换。 e 修饰符表示“将替换的右侧部分视为表达式”。

匹配模式寻找一对左方括号,然后记住除/.| 之外的字符序列,可选地后跟 |] 以外的字符序列,以一对右方括号结束。这两个捕获是 $1$2

替换表达式将 $1$2 的值保存在变量 $x$y 中。然后它对 $x 应用更简单的替换,将下划线更改为斜杠。那么结果值为[[$x$y]]的字符串。您不能直接在替换表达式中修改 $1$2。而内部 s%_%/%g; 破坏了 $1$2,这就是为什么我需要 $x$y

可能有另一种方法可以做到这一点 - 这是 Perl,所以 TMTOWTDI:有不止一种方法可以做到这一点。但这至少有效。

关于linux - 翻译一行的一部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9438680/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com