16836


ログの収集で正規表現を使って、`\`(バックスラッシュ)よりも前の文字列(下記の場合だと`stat/about`)を取得したいと考えています。

置換は分かるのですが、その部分だけ抜き取る正規表現の書き方がわかりません。  
どうかご教授いただけませんでしょうか。

[code]

    stat/about\,\form
    posts/6\,\format\
    
[/code]


CC BY-SA 4.0
2015-09-20T03:17:31.793
16785
2021-05-14T11:22:12.320
2021-05-14T11:22:12.320
3060
12380
question
linux shellscript
Linuxのスクリプトで特定の文字列以前の文字を取得、もしくは以降の文字以降を削除


逆に「バックスラッシュとそれ以後を消す」と考えて、そこの部分を正規表現でマッチさせて、空文字に置換しては？

[code]

    sed -e 's/\\.*//'
    
[/code]

バックスラッシュが複数あるときは複数取り出したい、というなら、awkでフィールド区切り文字をバックスラッシュにすればいいかと。


CC BY-SA 3.0
2015-09-21T16:25:35.460
16828
2015-09-21T16:25:35.460
12269
16785
answer


cut コマンドを使う方法もあります(正規表現は使っていませんが…)。

[code]

    $ echo 'stat/about\,\form' | cut -d\\ -f1
    stat/about
    
[/code]

その他、GNU grep では以下の様になります。

[code]

    $ echo 'stat/about\,\form' | grep -Po '^.*?(?=\\.*)'
    stat/about
    
[/code]


CC BY-SA 3.0
2015-09-21T23:36:34.663
16836
2015-09-21T23:36:34.663
16785
answer


awk を使う方法をご紹介します。

[code]

    $ awk -F '\' '{print $1}' data.txt
    stat/about
    posts/6
    
[/code]

`-F '\'` は区切り文字を「\」と指定します。  
`{print $1}` は 区切り文字で分割した 1番目の値を表示します。  
data.txt は 変換前のテキストデータです。

標準入力から読み込む場合は

[code]

    $ echo 'stat/about\,\form' | awk -F '\' '{print $1}'
    stat/about
    
    $ cat data.txt | awk -F '\' '{print $1}'
    stat/about
    posts/6
    
[/code]

こうなります。


CC BY-SA 3.0
2015-09-22T23:58:00.490
16859
2015-09-22T23:58:00.490
5008
16785
answer


`grep` でマッチした部分だけ出力、というのがぱっと浮かんだ方法です。

[code]

    $ cat <<'EOF' | grep -o '^[^\\]*'
    stat/about\,\form
    posts/6\,\format\
    EOF
    
    stat/about
    posts/6
    
    
    $ echo 'stat/about\,\form' | grep -o '^[^\\]*'
    
    stat/about
    
[/code]


CC BY-SA 4.0
2021-05-14T10:58:35.343
75837
2021-05-14T10:58:35.343
34583
16785
answer