4

我的表格中有几行要从 Excel 转换为 Wiki 格式,如果该字段中有文本,我想为每行的部分文本添加链接标签。我已经开始了转换工作并来到了这一点:

|10.20.30.9||x|-||
|10.20.30.10||x|s04|Server 4|
|10.20.30.11||x|s05|Server 5|
|10.20.30.12|||||
|10.20.30.13|||||

我想要的是将第四列从例如更改s04 为[[server:s04]]. 如果该行为空或包含 -. 如果这 -是一个大问题,我可以删除它。

我对正则表达式的所有尝试都以从被替换的整行结尾处获取任何内容。

4

7 回答 7

4

这似乎在你放弃的样本上完成了工作(使用 Vim):

%s/^|\%([^|]*|\)\{3}\zs[^|]*/\=(empty(submatch(0)) || submatch(0) == '-') ? submatch(0) : '[[server:'.submatch(0).']]'/
于 2012-05-22T15:36:07.177 回答
4

考虑使用awk这样做:

#!/bin/bash

awk -F'|' '
{ 
  OFS = "|";
  if ($5 != "" && $5 != "-")
    $5 = "server:" $5;
  print $0
}'

注意:我从第一个版本开始就编辑了这个脚本。目前的这个,IMO 更好。

然后您可以使用以下方法处理它:

cat $FILENAME | sh $AWK_SCRIPTNAME

-F'|'开关告诉awk用作|字段分隔符。if/elseandprintf语句是非常不言自明的。它打印字段,在第 5 列前附加“服务器:”,仅当它不是"-"或时""

为什么是第 5 列而不是第 4 列?:因为您|在每条记录的开头使用。因此awk,将 'first' 字段 ( $1) 视为一个空字符串,它认为应该在此 first之前|出现。

于 2012-05-22T14:56:44.167 回答
3

It's probably better to use awk as ArjunShankar writes, but this should work if you remove "-" ;) Didn't get it to work with it there.

:%s/^\([^|]*|\)\([^|]*|\)\([^|]*|\)\([^|]*|\)\([^|]\+|\)/\1\2\3\4[[server:\5]]/

It's just stupid though. The first 4 are identical (match anything up to | 4 times). Didn't get it to work with {4}. The fifth matches the s04/s05-strings (just requires that it's not empty, therefor "-" must be removed).

于 2012-05-22T15:19:50.297 回答
2

为其他人给出的想法增加一点可读性:

:%s/\v^%(\|.{-}){3}\|\zs(\w+)/[[server:\1]]/

任务完成。

请注意 {3} 如何指示要跳过的列数。还要注意使用非常神奇的\v表达式模式。这降低了正则表达式的复杂性,尤其是当它使用比文字文本更多的“特殊”字符时。

于 2012-05-22T23:02:35.877 回答
1

让我推荐以下替换命令。

:%s/^|\%([^|]*|\)\{3}\zs[^|-]\+\ze|/[[server:&]]/
于 2012-05-23T06:08:40.637 回答
0

可以通过以下方式实现更简单的替换:

%s/^|.\{-}|.\{-}|.\{-}|\zs\(\w\{1,}\)\ze|/[[server:\1]]/

   ^^^^^^^^^^^^^^^^^^^^                   -> Match the first 3 groups (empty or not);
                       ^^^                -> Marks the "start of match";
                          ^^^^^^^^^^^     -> Match only if the 4th line contains letters numbers and `_` ([0-9A-Za-z_]);
                                     ^^^  -> Marks the "end of match";

如果_字符类似于-, 可以出现但不能被替换,请使用以下正则表达式:%s/^|.\{-}|.\{-}|.\{-}|\zs\([0-9a-zA-Z]\{1,}\)\ze|/[[server:\1]]/

于 2012-05-22T16:57:31.780 回答
0

尝试

 :1,$s/|\(s[0-9]\+\)|/|[[server:\1]]|/

假设你的 s04, s05 总是 s 和一个数字

于 2012-05-22T15:17:43.030 回答