次のような多くの行を含むファイルからテキストを抽出するためのBASHスクリプトを作成しようとしています。
"11","category/subcategory/sub-subcategory/item-1","index.php?option=com_trombinoscopeextended&Itemid=125&lang=es&view=trombinoscope","251","0","0000-00-00","","","","","","","0"
各行で次を維持するだけです。
category/subcategory/sub-subcategory/item-1
コンテキストを削除できます。 sedを使用しようとしていますが、これを行う方法が見つかりませんでした。すでに持っている正規表現を使用してコマンドを生成する方法を理解できません。
\w+(\/[\w-]+)+
私はこのコマンドと他のコマンドを読んですでに試しましたが、よく理解していません。
cat file.txt | sed -i -E "s/\w+(\/[\w-]+)+"
これは間違いなくうまくいかず、sedと正規表現の使い方に関する初心者ガイドを見つけることができません。
答え1
以下を使用してこれらのファイルを解析するのが最善ですawk
。
awk -F, '{ print $2 }' file
またはcut
、
cut -d, -f 2 file
"category/subcategory/sub-subcategory/item-1"
これにより、あなたが提供したデータ(引用符を含む)が提供されます。
を使用しsed
て提供された正規表現を使用します(ただし、\w
に置き換えます[[:alnum:]]
)。
sed -E 's@.*,"([[:alnum:]]+(/[[:alnum:]-]+)+)",.*@\1@' file
これにより、行全体が最初の角かっこセット内の正規表現に一致するビットに置き換えられます。これによりcategory/subcategory/sub-subcategory/item-1
提供されたデータが返されます。
カンマや二重引用符を含めることができるフィールドや引用符の正しい処理など、より一般的なCSVファイルの解析を実行するには、次のようにします。csvkit
:
csvcut -c 2 file
答え2
正規表現自体には何の問題もありません。誤って罠に陥っただけです。 [] 内の \w は 2 つのリテラル、つまりバックスラッシュと "w" です。思う"\w"ではないか、Perlでのようにそこから借りてきたのですが、正確に借りてきたわけではありません。
1 つの方法は、\w の内容を明示的にリストし、続行することです。
sed -Ee '
/\n/{P;D;}
s|\w+(/[-_A-Za-z0-9]+)+|\n&\n|;D
'