カスタム正規表現区切り文字を使用してパターンを含む行番号を検索する

カスタム正規表現区切り文字を使用してパターンを含む行番号を検索する

のようにはいパターンを含む行番号を取得しようとしています。私のパターンにはスラッシュが含まれているので、カスタム区切り文字を追加したいと思います。

この簡単なアプローチが効果的です。

sed -n '/file/=' temp.txt

区切り文字を使用した文字列の置換も可能です。

sed 's|file|gile|' temp.txt

ただし、最初の例で区切り文字を追加しようとすると、次のようになりません。

sed -n '|file /etc|=' temp.txt

私はスラッシュを避けることができることを知っていますが、カスタム区切り文字を追加したいと思います。私のコマンドを修正する方法を知っていますか?

答え1

スティーブンあなたのため解決策sed

sed -n  '\|file /etc|=' file 

他のツールを使用したい場合は、この方法も可能です。

grep -n 'file /etc' file

行番号のみを取得するには、行自体も印刷します。

grep -n 'file /etc' file | cut -d: -f 1

または、次のものを使用できますperl

perl -lne 'm|file /etc| && print $.' file 

またはawk:

awk '$0 ~ "file /etc" {print NR}'

答え2

すべてのコンテキストアドレスからエスケープする必要があります。開く/後に続くエスケープ文字は、閉じた区切り文字ではなくリテラル文字として扱われます。

  • 基本区切り記号:

    /start/,/end/{/pattern/d;}
    
  • カスタム区切り記号:

    \#start#,\#end#{\#pattern#d;}
    

よりPOSIX ドキュメント:

コンテキストアドレスの構造\ cREc(ここで、cはバックスラッシュまたは改行文字を除くすべての文字)は/ RE /と同じです。 c で指定された文字がバックスラッシュの後に表示される場合、その文字はリテラル文字とみなされ、RE を終了しません。たとえば、コンテキストアドレス\ xabc \ xdefxでは、2番目のxは自分自身を表すため、正規表現はabcxdefです。

GNUページの同様の説明sed man

/regexp/
       Match lines matching the regular expression regexp.      
\cregexpc
       Match lines matching the regular expression regexp.  
       The c may be any character.

そしてFreeBSDsed manページ:

In a context address, any character other than a backslash (``\'')
or newline character may be used to delimit the regular expression.
The opening delimiter   needs to be preceded by a backslash unless it
is a slash.  For example, the   context address \xabcx is equivalent
to /abc/.  Also, putting a backslash character before   the delimiting
character within the regular expression causes the character to be
treated literally.  For example, in the context address \xabc\xdefx,
the RE delimiter is an ``x'' and the second ``x'' stands for itself,
so that the regular expression is ``abcxdef''.

関連情報