テキストファイルがあります。これは、いくつかのパターンを含む大きなテキストファイルです。
(1), (3), (1,2,3), (1,2,3,4,5,6,7,8,9)
...このように、
(Fig1) (Fig1,Fig2), (Table-1, Table-2) etc.
私はこの出力が欲しい
[1], [3], [1,2,3], [1,2,3,4,5,6,7,8,9], (Fig1) (Fig1,Fig2), (Table-1, Table-2)
私の言葉は、()を数字のみを含む[]に変更したいという意味です。助けてください
答え1
そしてsed
:
sed 's/(\([0-9,]*\))/[\1]/g' filename.txt
[0-9,]*
数字とカンマの数に関係なく、一致する正規表現です。\(\)
バック\1
スラッシュのない単純な角括弧はそれ自体を表します。[]
(代替文字列には特別な意味はありません)に置き換えられます。
答え2
Python 3スクリプトソリューション
以下のスクリプトは正規表現を使用しないより明示的な「手動」ソリューションですが、これを行うときに考慮すべきいくつかの追加の考慮事項があります。これは、スクリプトがコマンドラインで提供するすべてのファイルを読み取り、各行の各文字を繰り返しながら括弧を見つけることです。かっこが表示されたら、中に内容を記録し、カンマを捨ててこれが数値文字列かどうかを判断します。数値文字列の場合、記録された項目は単語リストに入り、後で区切り文字を持つ関数を使用して1行に再.join()
編成されます", "
。とても率直です。
#!/usr/bin/env python3
import sys
with open(sys.argv[1]) as fd:
for line in fd:
# we're going to store everything into list of words
# and record individual characters into 'item' string
# and rebuild everything as we go.
words = []
item_found = False
item = ""
counter = 0
for char in line:
# if we see ( or [ we start recording chars
# difference is that [ means item already been edited
# so no need to do anything - just put it into words list
# as is
if char == "(" or char == "[":
item_found = True
counter = counter + 1
continue
if char == ")":
item_found = False
if item.replace(",","").isdigit():
words.append("[" + item + "]")
else:
words.append("("+item+")")
item = ""
if char == "]":
item_found = False
item = item + char
words.append("[" + item)
item = ""
if item_found:
item = item + char
# if we didn't see any open brackets or no closing brackets
# just print the line as is - otherwise give us the altered one
if counter == 0 or item_found:
print(line.strip())
else:
print(", ".join(words))
テスト実行:
私はOPの入力を自由に使用し、いくつかの異なるテストケースと一緒に2行を追加しました。
$ # original input file
$ cat input.txt
(1), (3), (1,2,3), (1,2,3,4,5,6,7,8,9), (Fig1) (Fig1,Fig2), (Table-1, Table-2)
(table-25),[1,2,3],(figure-35)
(figure-1),(figure-2)
$ # script output
$ ./change_brackets.py input.txt
[1], [3], [1,2,3], [1,2,3,4,5,6,7,8,9], (Fig1), (Fig1,Fig2), (Table-1, Table-2)
(table-25), [1,2,3], (figure-35)
(figure-1), (figure-2)
40,000行のテキストに対して非常に迅速に行われます。
$ wc -l big_input.txt
40000 big_input.txt
$ time ./change_brackets.py big_input.txt > /dev/null
0m01.64s real 0m01.60s user 0m00.01s system
可能な改善のための提案(およびスティーブンが言及したものの1つを扱う)if item.replace(",","").isdigit()
は行をに変更することですif item.replace(",","").replace(".","").isdigit()
。これにより、浮動小数点数(3.1415など)を処理することもできます。
長い?はい。明らかな?はい。効果的ですか?はい。
答え3
sed -E 's/[(](([0-9]+,?)+)[)]/[\1]/g'
sed -e 's/(\(\([0-9]\{1,\},\{0,\}\)\{1,\}\))/[\1]/g'
(および)角括弧で囲まれた正規表現[0-9] +、?が1回以上同時に発生する場合を探します。成功すると、外側の括弧が[]に変わります。
2番目のsedステートメントは上記のステートメントのPOSIXlyバージョンです。