正規表現の構文で停止する

正規表現の構文で停止する

私はデフォルトのシェルスクリプトを作成しており、使用する前に少し編集する必要があるデータファイルを受け取りました。問題は、複数行、さらには単語まで繰り返されることです。だから私はvimの置換コマンドを使用したり、クイック編集のためにsedを使用したいと思います。問題は、基本的に「なし」に置き換えるパスに一致する実装がないことです。

実際のファイルは大きいので、一部だけ貼り付けます。ところで、次のような行がたくさんあるようです。

Category.php">category.php
Copyright.php">Copyright.php
Core.php">Core.php
Credit.php">Credit.php

問題は、その">category.php部分が必要ないので削除したいので、次の正規表現を得ました。

\">[A-z]+\.php[ ]+// したがって、空白がある場合は、デフォルトで空白のある文字クラスを追加します。また、問題が発生した場合に備えて最初の二重引用符を避けましたが、vimとsedの両方がその部分を削除できませんでした。

私が実行した実際のコマンドは次のとおりです。

sed "s/\">[A-z]+.php//g"そして:%s/\">[A-z]+.php//gvimから。

答え1

" を区切り文字として cut コマンドを使用します。

cut -d\" -f1 input-file

答え2

sedとvimの両方に正規表現に間違いがあります。他の人がいくつかの良い選択肢を提示しましたが、私はあなたが提供したコマンドがうまくいかない理由と解決策について説明したいと思います。

あなたの命令:sed "s/\">[A-z]+.php//g"

まず、あなたのキャラクタークラス有効な結末がなければならず、この場合[a-zA-Z]

第二に、+オペレータの特徴の一つは拡張正規表現(ERE)、デフォルトでは有効になっていません。有効にするには、および-E//フラグを使用してください-r--regexp-extended

これを行うか、演算子の前にバックスラッシュを付けることができます\+

修正されたコマンド: sed 's/\">[a-zA-Z]\+.php//g'

ウィム

あなたの命令::%s/\">[A-z]+.php//g

繰り返しますが、キャラクタークラスが間違っています。[a-zA-Z]検索が大文字と小文字を区別しない場合、これは重要ではない可能性があります。

~によるとvim マニュアル+期待どおりに機能するには、演算子の前にバックスラッシュを付ける必要があります。

修正されたコマンド: :%s/\">[a-zA-Z]\+.php//g


メモ:

  • sedでEREを使用すると、次のことができます\w[a-zA-Z]
  • vimでは、次のものを\a使用できます。[a-zA-Z]

答え3

おそらく正規表現を詳しく調べる必要はありません。サンプルawkスクリプトがアクションを実行します。

awk -F\" '{print $1}' input_file

区切り文字として使用"し、最初のトークンのみを印刷します。

答え4

次のようないくつかのXML文書で作業しているとしましょう。

<?xml version="1.0"?>
<root>
  <node attr="Category.php">category.php</node>
  <node attr="Copyright.php">Copyright.php</node>
  <node attr="Core.php">Core.php</node>
  <node attr="Credit.php">Credit.php</node>
</root>

node...値属性を持つノードの値を削除するとします。次のように使用できます。attrCategory.phpxmlstarlet

xmlstarlet edit --update '//node[@attr="Category.php"]' --value '' file.xml

または、より短い構文を使用すると、

xmlstarlet ed -u '//node[@attr="Category.php"]' -v '' file.xml

文字列は、属性がvalueのドキュメントのノードセットと一致する//node[@attr="Category.php"]XPathクエリです。nodeattrCategory.php

これは生成されます

<?xml version="1.0"?>
<root>
  <node attr="Category.php"/>
  <node attr="Copyright.php">Copyright.php</node>
  <node attr="Core.php">Core.php</node>
  <node attr="Credit.php">Credit.php</node>
</root>

Vimエディタでは、次のものを使用できます。

:%!xmlstarlet ed -u '//node[@attr="Category.php"]' -v ''

一致するノード全体(値だけでなく)を削除するには、次のようにします。

xmlstarlet edit --delete '//node[@attr="Category.php"]'

または

xmlstarlet ed -d '//node[@attr="Category.php"]'

xmlstarlet上記のコマンドの代わりに。

関連情報