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|||||

私が欲しいのは、4番目の列をたとえばからに変更するs04 こと[[server:s04]]です。行が空の場合、または行にが含まれている場合は、リンクブラケットを追加したくありません -。それ -が大きな問題であれば、私はそれを取り除くことができます。

行から何かを取得するための正規表現のすべての試みは、行全体が置き換えられます。

4

7 に答える 7

4

これを行うために使用することを検討しawkてください:

#!/bin/bash

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

注:最初のバージョンからこのスクリプトを編集しました。この現在のもの、IMOの方が優れています。

次に、次の方法で処理できます。

cat $FILENAME | sh $AWK_SCRIPTNAME

-F'|'スイッチは、フィールドセパレータとしてawk使用するように指示します。andステートメント|はかなり自明です。またはでない場合にのみ、列5の前に「server:」を付けてフィールドを出力します。if/elseprintf"-"""

なぜ列4ではなく列5なのですか?:|各レコードの先頭で使用するためです。したがってawk、「最初の」フィールド( )、この最初のの前に発生したはず$1の空の文字列であると見なされます。|

于 2012-05-22T14:56:44.167 に答える
4

これはあなたがそこで(Vimで)あきらめたサンプルで仕事をするようです:

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

ArjunShankarが書いているようにawkを使用する方がおそらく良いでしょうが、「-」を削除するとこれは機能するはずです;)そこでは動作しませんでした。

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

でもそれはばかげています。最初の4つは同一です(| 4回までのすべてに一致します)。{4}で動作しませんでした。5番目はs04/s05-stringsと一致します(空でないことが必要なため、「-」を削除する必要があります)。

于 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 に答える