のようにはいパターンを含む行番号を取得しようとしています。私のパターンにはスラッシュが含まれているので、カスタム区切り文字を追加したいと思います。
この簡単なアプローチが効果的です。
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''.