正規表現を使用したテキストのレビュー

正規表現を使用したテキストのレビュー

現在、インデントされているToDoリストを確認するためにこのコマンドを実行しています。

sed -e 's/\(\s\+- \)\(.*\)/\1XXX/g'

Xsの数が一致する文字の数と一致したいことを除いては大丈夫です。どうすればいいですか?正しい方法は特にsedを使用する必要はありません。

現在の入力例:

- Hello World
  - Earth

出力:

- XXX
  - XXX

期待する:

- XXXXXXXXXX
  - XXXXX

答え1

Perlソリューション:

perl -pe 's/^( *- )(.+)/$1."X"x length($2)/e'

これは、交換時に"X" x length($2)正しい数のsを得るために使用されます。X

テスト入力:

- Hello World
  - Earth
This is not - censored

出力:

- XXXXXXXXXXX
  - XXXXX
This is not - censored

答え2

次のようにすることもできますsed

sed '/^[[:blank:]]*-[[:blank:]]/{
h
s///
s/./X/g
x
s/\([[:blank:]]*-[[:blank:]]\).*/\1/
G
s/\n//
}' infile

hこれは、前のバッファに行をコピーし、最初の部分を削除し、残りの[[:blank:]]*-[[:blank:]]文字をに置き換えXxモード/予約スペースを変更するため、現在検討中の文字列はメンテナンスモードになり、元の行はパターンスペースに返されます。行の2番目の部分を削除し、予約済みs/\(...\).*//スペースの文字列をパターンスペース(G)に追加して、\newline文字を削除します。したがって、次のファイルを使用してください。

- line here
not - to be modified
  - a b c d e
 - another line-here

出力は次のとおりです

- XXXXXXXXX
not - to be modified
  - XXXXXXXXX
 - XXXXXXXXXXXXXXXXX

空白文字を削除し、空白以外の文字のみを次に置き換える場合X

sed '/^[[:blank:]]*-[[:blank:]]/{
h
s///
s/[[:blank:]]//g
s/./X/g
x
s/\([[:blank:]]*-[[:blank:]]\).*/\1/
G
s/\n//
}' infile

出力:

- XXXXXXXX
not - to be modified
  - XXXXX
 - XXXXXXXXXXXXXXXX

または、1行に以下を含めますgnu sed

sed -E '/^[ \t]*-[ \t]/{h;s///;s/[ \t]//g;s/./X/g;x;s/([ \t]*-[ \t]).*/\1/;G;s/\n//}' infile

^[[:blank:]]*-[[:blank:]]必要に応じて正規表現を調整します(例:)。

答え3

$ awk '/^[ ]*- /{gsub(/[^ -]/,"X",$0)}1' <<EOM
- Hello
  - World 2015
This is not - censored
EOM

- XXXXX
  - XXXXX XXXX
This is not - censored

この式は、文字(オプションのスペースの後ろ)で始まるすべての行をawk検索します。-一致する行の場合、このコマンドはスペースと文字を除くすべての文字をgsub()置き換えます。-最後は、行全体を再印刷する1ショートカットです。{print $0}

編集する:空白文字も削除/交換する必要があるため、追加のX交換を実行する以外に、よりエレガントな解決策を考えることはできません。

$ awk '/^[ ]*- /{gsub(/[^ -]/,"X",$0);gsub(/X X/,"XXX",$0)}1' <<EOM
- Hello World
  - Earth
This is not - censored
EOM

- XXXXXXXXXXX
  - XXXXX
This is not - censored

答え4

上記の行のスペースが重要でない場合は、次の行を使用できます。

Q='Some things\n - Hellow World\n   - Earth\nSome things Else'
echo -e "$Q" | awk '{ if ($0 ~ /^\s+-\s\w+/) print system("echo " $0 "| tr [:alnum:] x "); else print $0; }'  | grep -v ^0$

$0 ~ /^\s+-\s\w+/上記の正規表現を確認してください。

system(...)走る吹く内部コマンドawk

grep -v ^0$部分的にはsystem(...)戻ってくるからです。終了コードの状態

私たちは取り除くことができます。grep -v ^0$そしてgetline I/O ドアしかし、もっと複雑です。

関連情報