複数行からに[
置き換えるにはどうすればよいですか\[
? 1行に複数回可能ですが、で始まる行でのみ可能ですかABCD
?
答え1
存在するsed
:
sed '/^ABCD/ s/\[/\\[/g' filename
式は、アドレスの後にコマンドが続くものです。アドレスは、その行が正規表現(で始まる行)と一致する場合にのみ/^ABCD/
コマンドが実行されることを示します。^ABCD
ABCD
コマンドs/\[/\\[/g
は、すべての項目[
を\[
。通常、このコマンドの形式はですs/foo/bar/
。これは正規表現foo
をに置き換えることを意味しますbar
。最後のものは、g
1行に複数回一致するようにし、両方とも正規[
表現に特別な機能を持っているので、--for literalsおよびfor literals\
コマンドからエスケープされます。\[
[
\\[
\[
答え2
たぶんこれが正しいかもしれません:
perl -nle 'if ( /^ABCD/) { $_ =~ s/\[/\\[/g;};print'
(パール初心者はこちら...)
答え3
次のようなファイルを入力したとします。
$ cat input.txt
ABCD this line [ starts with [ abcd
this one doesn't
ABCD but this [ one does
あなたの質問はPerlでタグ付けされているので、次のいずれかを確認してください。
$ perl -pe '/^ABCD/ and s/\[/\\[/g' input.txt
ABCD this line \[ starts with \[ abcd
this one doesn
ABCD but this \[ one does
-p
暗黙のループと自動印刷を想定できます。行sed
がABCD
。
私たちはこれをawkで行うことができます:
$ awk '/^ABCD/{gsub(/\[/,"\\[")};1' input.txt
ABCD this line \[ starts with \[ abcd
this one doesn't
ABCD but this \[ one does
これは非常に簡単な方法で動作します。 - 行がで始まるとABCD
交換がgsub()
行われます。 - awkコードはevaluation { actions}
構造体で動作するため、1
すべての行で「true」を強制的に評価し、{ actions}
その部分を省略するとデフォルトで印刷されます。実行せずにタスクを短くする少しのトリックです。{print}
なぜできないのですか?ここにPythonがあります。
$ python -c 'import sys; print "\n".join([i.strip().replace("[","\[") if i.startswith("ABCD") else i.strip() for i in sys.stdin ])' < input.txt
ABCD this line \[ starts with \[ abcd
this one doesn't
ABCD but this \[ one does
これは非常に簡単な方法でも機能します。
- シェル演算子を使用してテキストをPython
stdin
ストリームにリダイレクトします<
。 - すべての行は構造内で読み取られ処理されます
[ item for item in iterable]
。これをリスト理解といいます。デフォルトでは、すべての行のリストを作成します。 i.strip().replace("[","\[") if i.startswith("ABCD") else i.strip()
とても簡単です。行が「ABCD」で始まる場合は、末尾の改行を切り捨てます。すべて[
に置き換え\[
、それ以外の場合は元の行を削除します。- すべての行をリストに読み込んだ後、行のリストは改行で区切られた文字列に再接続されて印刷されます。
スクリプト形式では次のようになります。
#!/usr/bin/env python
import sys
with open(sys.argv[1]) as fd:
for i in fd:
print i.strip().replace("[","\[") if i.startswith("ABCD") else i.strip()
次のように動作します。
$ ./add_slash.py input.txt
ABCD this line \[ starts with \[ abcd
this one doesn
ABCD but this \[ one does