最初のフィールドに特殊文字のみを含む行を削除する方法は?

最初のフィールドに特殊文字のみを含む行を削除する方法は?

最初の区切りフィールドにのみ/or'または-orを含む行を削除する方法は?.|

  • 試したコード:
    sed 's/^\.\d; /^\-/d; /^\//d' file > file_out
    
  • 入力例:
    /|98374|
    /trust|q83129|
    //|392720|
    //cust|23892|
    .|9374|
    .abcd|28374|
    '|238674|
    'hcsu|3810|
    -|327492|
    -abcde|9837|
    
  • 予想出力:
    .abcd|28374|
    /trust|q83129|
    //cust|23892|
    'hcsu|3810|
    -abcde|9837|
    

答え1

"Force"ベースのawkソリューション :)

awk -F'|' '$1 !~ /^[\/'\''.-]+$/' input.txt

これにより、フィールド区切り文字がに設定され、|条件が満たされた場合にのみ印刷されます。「最初のフィールド()は正規表現()$1と一致しません。!~/'.-^[/'.-]+$実現しました。

awkプログラムを一重引用符()で囲む必要があるため、これを表す構文は少し複雑です。' ... 'それ以外の場合、シェルはその文$1に到達する前と同様に文を解釈しますawk。したがって、文字リストは、'一重引用符の「中断」(最初のもの)、エスケープされたリテラル一重引用符(\')、一重引用符プログラムの連続で構成されますawk

または、読みやすくすることもできます。引用符付き文字列、引用符付き文字列、および他の引用符付き文字列を連結してプログラムを作成しますawk'...'"..."'...'

awk -F'|' '$1 !~ /^'"[\/'.-]"'+$/' input.txt

答え2

|最初の区切りフィールドがセットの文字のみで構成された行を削除する場合は、.-/'次のようにします。

grep -vxE "[./'-]+(\|.*)?"

-v(セット内の1つ以上の()文字シーケンス-x、その後にオプションの()、任意の数字()文字()で構成される行()を完全に削除します。)+./'-?|*.

または

grep -vE "^[./'-]+(\||\$)"

^(()で始まり、setに1つ以上の(+)文字が含まれ、./'-その後に(||または行の終わり(エスケープされた行を削除します$。これは、二重引用符内のシェルには特別ですが、通常は後にはないため)) )。

最初のフィールドが空の行も削除するには、に+置き換えます。*または以下を使用してください。

grep "^[^|]*[^|./'-]"

最初の文字()^以外の1つ以上の文字を含む行を検索します。./'-|

より一般的には(and - >)sed /regexp/dで書くことができます。より小さく、通常より速いという点に加えて、拡張正規表現を移植できるという利点があります。しかし、すべての実装はそうではありません。正規表現をサポートする実装よりも正規表現をサポートする実装が多い。grep -v regexpsed '/re1/d; /re2/d'grep -v -e re1 -e re2grepsedsed-Egrep-Pperlsed

答え3

あなたは何を期待しますかs/^\.\d?代替コマンドを開きましたsが、誤って別のスラッシュで閉じました。/^\./dドットのある線を削除したい場合がありますが、これによりその線も削除され.abcdます。

./'-しかし、実際には、前にある文字以外に文字のない行を削除したいようです|。したがって、これを正規表現に入れてください。

sed "/^[./'-]*|/d" < file > file_out

目的の出力で印刷行を並べ替えることはありませんが、並べ替え方法を指定しませんでした。

そして、あなたの例では、空の最初のフィールドを処理する方法を示していません。これを印刷する必要がある場合は、以下を使用してください。

sed "/^[./'-]\{1,\}|/d" < file > file_out

答え4

awk -F '|' "\$1 ~ /[^-./']|^$/" file

関連情報