2017-10-11 19 views
0

これはおそらくSedとシェルのスクリプト構文の問題とRegexです。 (編集:多分I/O発行、bashシェル内のファイルを読み取ることが、実際.txtファイルが所望のように変化しなかった場合、正規表現は、仕事のように)いくつかの自然言語処理のため.txtファイルを準備しようとSed Regex OSXはローマ数字を見つけ、空文字列に置き換えます。エラー "unterminated substitute pattern"

を作業。シェークスピアのソネットを含むプレーンテキストファイルのローマ数字を削除することを希望しました。各ソネットは小文字を含めて個々のソネットのタイトルを表すIX.XVIII.のようなローマ数字で始まります。テキストintput

例:

XXV.

Let those who are in favour with their stars

Of public honour and proud titles boast,

所望の出力:

Let those who are in favour with their stars

Of public honour and proud titles boast,

this questionの例に続いて、私はターミナルbashシェルで、次のすべてのコマンドを試してみました:

$ sed -i 's/[IVXLC]{1,}[.]//g' sonnets.txt

$ sed -i 's/[IVXLC]{1,}[.]/^$/g' sonnets.txt

$ sed -i 's/[IVXLC]{1,}[.]/()/g' sonnets.txt

$ sed -i 's/[IVXLC]{1,}[.]/[]/g' sonnets.txt

アイデアは、空の文字列と一致するものがすべて交換しました。

$ sed -i 's/[IVXLC]{1,}[.]/^ $/g' sonnets.txt

ありません運:それは動作しませんでしたので、私はスペース文字との一致を交換しようとしました。上記のすべてのコマンドは、同じエラーを返しました:

sed: 1: "sonnets.txt": unterminated substitute pattern

私はhttps://regexr.com/に「検索」フィールドに正規表現をテストし、正しいように見えました。ターゲットファイルは作業ディレクトリの中にあります。どのようなアイデアが間違っていた? Sedコマンドの "replace"フィールドにはどのような文字を使用する必要がありますか?正規表現やSedコマンドを変更する必要がありますか?

+0

サンプルテキストを貼り付けることはできますか?入力とはどのようなもので、どのように出力が見えるようにしますか? ? –

+0

'{'と '}'をエスケープする必要があると思います。 '\ {'と '\}'を使います。大括弧で囲まれた括弧も確実にエスケープする必要があります。 –

+0

'{} []'はhttps://regexr.com/でテストするときに問題にはならないと思われます – Elan

答えて

1

@ジョナサンレフラーはコメントで述べたように、私のMacは、BSD sedを使用して、コマンドが機能しなかった理由です。

だから私は自作を通じてGNU sedをインストール:

brew install gnu-sed

は、次にコマンドを使用:gsed

gsed -i 's/[IVXLC]\{1,\}[.]//g' sonnets.txt

タイピングGNU sedを呼び出し、必要に応じて、それが働きました。これにより、.txtファイルの内容が変更されました。この構成では

、@Hakan馬場が述べたように、正規表現は中括弧エスケープする必要がありました:問題は(を制限または)の範囲であるように思わ

\{\}

+0

実際には範囲がなくてもかまいません/限定量をここで制限する、私の答えを見てください。 –

1

中括弧はエスケープする必要があります。

$ sed 's/[IVXLC]\{1,\}[.]//g' sonnets.txt 


Let those who are in favour with their stars 

Of public honour and proud titles boast, 
0

を数量詞{m,n}あなたのBSD sedバージョンではサポートされていません。あなたが唯一の開始時にローマ数字と一致することを確認する必要がある場合、また

sed -i 's/[IVXLC][IVXLC]*[.]//g' sonnets.txt 
      ^^^^^^^^^^^^^^^ 

:あなたは[IVXLC][IVXLC]*(0+ローマ数字で、その後1ローマの「数字」)を使用して{1,}数量詞を書き換えることに注意してくださいパターンの先頭に^を追加します(つまり、正規表現の末尾にg修飾語を省略することもできます)。これらを完全な単語として一致させるには、パターンの先頭に単語の先頭に[[:<:]]を追加します。

+0

'[IVXLC] [IVXLC] *'の面白い考えです!私が使っていたこの特定の文書では、シェイクスピアによって書かれたすべてのソネットを示す100以上のローマ数字が含まれています。テキスト入力全体の開始と終了を示す '^'と '$'文字はおそらく適用されません。 – Elan

+0

しかし、 '[[:<:]]'の最初の単語の境界線が重要です。 –

関連する問題