現在、インデントされているToDoリストを確認するためにこのコマンドを実行しています。
sed -e 's/\(\s\+- \)\(.*\)/\1XXX/g'
X
sの数が一致する文字の数と一致したいことを除いては大丈夫です。どうすればいいですか?正しい方法は特に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:]]
文字をに置き換えX
てx
モード/予約スペースを変更するため、現在検討中の文字列はメンテナンスモードになり、元の行はパターンスペースに返されます。行の2番目の部分を削除し、予約済みs/\(...\).*//
スペースの文字列をパターンスペース(G
)に追加して、\n
ewline文字を削除します。したがって、次のファイルを使用してください。
- 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 ドアしかし、もっと複雑です。