web-dev-qa-db-ja.com

sedを使用して行の一部を取得する

私はこのようなgitsvnコマンドを持っています:

_git svn log --limit=1 --oneline_

次のように1行が出力されます。

_r12345 | <anything, as it is svn comment inputted by svn-user>_

Sedコマンドをパイプして_12345_のみを取得しようとしていますが、機能しません。エラーが多く、現在のエラーは_parenthesis not balanced_です。

私の最後のコマンドは次のとおりでした:

git svn log --limit=1 --oneline | sed -e 's/r\(0-9) |*/\1/'

私はグーグルで検索しましたが、sedのドキュメントは明確ではありません...私は正規表現があまり得意ではありません。私の最高の経験は_git --grep_で、これは優れたドキュメントで簡略化された正規表現です。

重要な場合、環境はMacOSX端末です。

編集:

sed -n 's/r\(0-9*\)/\1/は機能しますが、空の文字列を返します。

7
Zennichimaro

これが正規表現のない解決策です なぜなら

問題に直面したときに、「わかっている、正規表現を使用する」と考える人もいます。今、彼らは2つの問題を抱えています。

(一粒の塩でそれを取る)

cut を2回使用できます。

git svn log --limit=1 --oneline | cut -d ' ' -f 1 | cut -c 2-

最初のカット(cut -d ' ' -f 1)スペースを列区切り文字として設定し、最初の列のみを選択するため、r12345。 2番目のカット(cut -c 2-)位置2以降の文字を選択します(2-)。

14
gronostaj

もうすぐです

_sed -e 's/r\([0-9]*\) .*/\1/'
_

Sedに\([0-9]*\)が必要なものと不要なものの両方を伝える必要があります/ r&_.*/_

7
Nifle

sedは行を変更するためのものであるため、ここでは最適なツールではないように感じますが、これは抽出の問題と見なしています。グループとの正規表現は、非常に合理的な方法です。なんらかの理由で、grepにはグループを抽出する方法がありませんが、これは奇妙だと思います。ありがたいことに、pcregrepはそうします。

pcregrep -o1 "^r([0-9]+)"

行の先頭でのみ、パターン「r」の後にいくつかの数字が続きます(これが^ does-そうでなければ、コミットメッセージが別のコミットを参照している場合、複数の一致を抽出する可能性があります)。 -o1は最初のグループを抽出することです。例:

$ echo "r12345 | <anything>" | pcregrep -o1 "^r([0-9]+)"
12345

なぜsedの代わりにこれを使用するのですか?純粋に単純化のため。何かを抽出するだけでよいので、純粋な正規表現を使用できます。私はこれをsedの答えよりもはるかに単純だと考えています。

3
Kat