Unix bash Sed コマンドが 1 つのファイルに結合される

Unix bash Sed コマンドが 1 つのファイルに結合される

次の不要な文字で区切られた文字列を含むファイルがあります。

  1. <
  2. >
  3. |
  4. <スペース>

次のようになります。

...  > Test Item|Test Item ...

~上...楕円は連続を表します。ファイルは1行だけで構成されます。

文字列を区別するために単一の文字列のみを使用するようにファイルを変更したいと思います。<スペース>性格。たとえば、

... Test Item Test Item ...

私はsed以前試しました:

sed -e 's/< >*| */|//g' filename

ただし、次のエラーメッセージが返されました。

sed: 0602-404 Function s/<  *| */|//g cannot be parsed.

何をすべきか?

答え1

次の方法を試してください。

sed -e 's:<>\s\|.*:Replaced:g' filename

結果は次のとおりです。

$ echo "<> |" | sed -e 's:<>\s\|.*:Replaced:g'
Replaced

単に削除するには、Replacedコマンドからその単語を削除します。

<記号との間にスペースがある場合は、に>置き換える必要があります。<><\s>

質問を更新した後:

$ cat filename
  > Test Item|Test Item
  < Test Item|Test Item

$ cat filename | sed -E 's:[<>]\s(.*)\|(.*)$:\1 \2:g'
  Test Item Test Item
  Test Item Test Item

答え2

<> |ファイルにアーカイブするデータに表示される可能性のない文字がある場合、最も効率的な解決策はtrその文字を完全に削除することです。

tr '<>|' '   ' <infile |    ###translate all delimiter chars to spaces
tr -s ' '     >outfile      ###pipe results to second tr and squeeze spaces

sed 可能それはあなたにも効果があるでしょうが、そうすればほぼ確実に速度が遅くなります。\n行線区切り記号に基づいていない入力ファイルを使用するときと、行線で区切られた\nデータを処理するように設計されたツールを使用するときは注意が必要です。(例:sedgrepいくつかの実装はバッファ圧力によって崩壊する可能性があるためです。

あなたの問題はそうではありません(しかし)sedしかし、間違った構文をコマンドとして送信しました。 @Archemarはすでにそれが何であるか言及していますが、その理由は次のとおりです。

置換はsed s///3つのフィールドで構成されるコマンドです。

  1. コマンドsプリミティブの後に区切り文字が続きます。(通常/
  2. 正規表現パターンフィールドの後に同じ区切り文字がある
  3. フィールドの置換の後に、区切り文字とオプションのフラグが続きます。

後者のいずれかまたは両方が異なる理由で長さがゼロになる可能性がありますs///(状況により異なる)許可される構文。これはsed、パーサーが区切り文字に大きく依存する必要があることを意味します。コマンドでフィールドを指定しすぎました。これは構文エラーなので機能を解決できません。

実装がsed1行入力を処理でき、POSIXと互換性がある場合は、次のように動作します。

sed 'y/<>|/   /;s/  */ /g' <infile >outfile

...y上記の基本要素は、sed独自のtr音域機能です。

関連情報