私はデフォルトのシェルスクリプトを作成しており、使用する前に少し編集する必要があるデータファイルを受け取りました。問題は、複数行、さらには単語まで繰り返されることです。だから私は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//g
vimから。
答え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
...値属性を持つノードの値を削除するとします。次のように使用できます。attr
Category.php
xmlstarlet
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クエリです。node
attr
Category.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
上記のコマンドの代わりに。