最初の区切りフィールドにのみ/
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 regexp
sed '/re1/d; /re2/d'
grep -v -e re1 -e re2
grep
sed
sed
-E
grep
-P
perl
sed
答え3
あなたは何を期待しますかs/^\.\d
?代替コマンドを開きましたs
が、誤って別のスラッシュで閉じました。/^\./d
ドットのある線を削除したい場合がありますが、これによりその線も削除され.abcd
ます。
./'-
しかし、実際には、前にある文字以外に文字のない行を削除したいようです|
。したがって、これを正規表現に入れてください。
sed "/^[./'-]*|/d" < file > file_out
目的の出力で印刷行を並べ替えることはありませんが、並べ替え方法を指定しませんでした。
そして、あなたの例では、空の最初のフィールドを処理する方法を示していません。これを印刷する必要がある場合は、以下を使用してください。
sed "/^[./'-]\{1,\}|/d" < file > file_out
答え4
awk -F '|' "\$1 ~ /[^-./']|^$/" file