2016-10-18 20 views
0

sedコマンドの実行に問題があります。 sedコマンドが実際にkshスクリプトを処理しているかどうかを最初に知りたいと思います。私はkshスクリプトを実行するツールとしてパテを使用しています。Sedコマンドは「Unrecognized Command」エラーをスローし続けます

実際に動作する場合は、私が使用しているコマンドはsed -e [^a-zA-Z0-9] <file>です。

私はgrepに対して実際にこのコマンドを実行します。grep [^a-zA-Z0-9] <file>

私の目標は、テキストファイル内のすべての特殊文字を取得し、それを変数または別のファイルに戻すことです。私はこのサイトと他のすべてのサイトのためにこれを探していますが、実際に私のために働くものは一切見つかりませんでした。

答えて

0

あなたは有効なsedスクリプトではありません。この問題は、引用の欠如によって悪化する。

引用符がない場合、シェルは式[^a-zA-Z0-9]を一致するファイル名のリストに展開しようとします。現在のディレクトリに,?という名前のファイルがある場合は、grepが実行される前にglobがgrep , ? <file>に展開されます(シェルの設定にもよりますが、shopt -s nullglobと一致するものがないとパターンは消えます)。 )。

sedの構文は異なります。 sedで正規表現に一致するには、スラッシュが設定可能である

sed '/[^a-zA-Z0-9]/' <file> 

を使用します。たとえば、あなたがスラッシュが含まれている正規表現を使用している場合、あなたはバックスラッシュを付けることによって異なる区切り記号を使用することができます:あなたが一致だけ文字を抽出したい場合は

sed '\#[^a-zA-Z0-9/]#' <file> 

は、grep -oを試してみてください - また、変数を適切に引用するよう注意してください。

chars=$(grep -o '[^a-zA-Z0-9]' <file>) 
echo "$chars" # double quotes are *absolutely* *crucial* 

二重引用符がなければ、再び、シェルは現在のディレクトリ内のファイルのリストにchars内の任意*を拡大しようとしていました。

+0

引用はhttp、より詳細に説明されています。 //stackoverflow.com/questions/10067266/when-to-wrap-quotes-around-a-variable – tripleee

0

sedは、シェルの外部のバイナリユーティリティです。

$ which sed 
/usr/bin/sed 

あなたの規定の目標は、特殊文字がセットになっていないこといずれかであるsedおよび/またはgrepを使用して、テキストファイルから「特別な」文字の全てを取得することであると、それがどこにあるかを確認することができますaz、AZ、または0-9です。 sedを使用することが最も簡単な方法です:

$ sed -e 's/[a-zA-Z0-9]//g' file 

これは効果的にファイルからそれらを削除し、空の文字で、すべての非特殊文字を置き換えます。grepについては

$ sed -e 's/[a-zA-Z0-9]//g' /etc/passwd 
:::::/:// 
:::::/:// 
:::::/:// 
::::://:// 
:::::///:// 
:::::/:// 
:::::/:// 
:::::/:// 
:::::///:// 
:::::/:// 
::::://:// 
:::: ://:// 
:::::/:// 
:::::///:// 
-:::: :/:// 
-:::: :/:// 
-:::: :/:// 
--:::: :/:// 

あなたは出力に一致する値を-oオプションを使用することができます:入力、出力、これに似た何かをされますよう/etc/passwdを用いて、実施例

、しかし、それぞれのマッチングを同様の出力を生成します
$ grep -o '[^a-zA-Z0-9]' /etc/passwd 

新しい行に文字が表示されます。

別のオプションがtrです:前sedコマンドと同じ出力を生成します

$ tr -d '[:alnum:]' </etc/passwd 

。あなたは、このようなコマンドの標準出力をキャプチャすることができ、すべての3例で


$ specials=$(tr -d '[:alnum:]' </etc/passwd) 
$ echo $specials 
:::::/:// :::::/:// :::::/:// ::::://:// :::::///:// :::::/:// :::::/:// :::::/:// :::::///:// :::::/:// ::::://:// :::: ://:// :::::/:// :::::///:// -:::: :/:// -:::: :/:// -:::: :/:// --:::: :/:// :::: :/:// :::: :/:// :::: :///:// :::: :///:// ::::://:// :::: ://:// :::::/:// :::: :///:// :::::///:// :::: /- :///-:// :::::///:// :::: :///:// :::: :/:// :::::///:// ::::://:// -:::: :/:// :::: :/:// :::: ://:// :::: :/:// :::: :///:// :::: :///:// --::::://--/:// -:::: :/:// ::::- :///:// :::: ://:// :::::/:// ::::://:// ::::://:// :::: ://:// :::: :///:// :::: :///:// :::: :///:// 

引用符をバック使っても動作します:

$ specials=`tr -d '[:alnum:]' </etc/passwd` 
+0

'echo" $ specials "のような変数を引用しないと、私の中で概説されているように、以前の答え。 – tripleee

+0

ありがとう! :)これは私のgrep -o '[^ a-zA-Z0-9]のために働いています。 – JMM

+0

@JMM:問題ありません。 3つのオプションがすべて機能します。あなたが答えに満足しているなら、それを受け入れることを検討することができます。 – mhawke

関連する問題