単語を改行で置き換える方法


11

次のデータを含むテキストファイルがあり、各行の末尾は|END|です。

T|somthing|something|END|T|something2|something2|END|

私はsed |END|\n新しい行に置き換えることを試みています。

 sed 's/\|END\|/\n/g' test.txt

しかし、それは以下のような間違った出力を生成しています:

 T
 |
 s
 o
 m
 e
 ...

しかし、私が欲しいのはこれです:

T|somthing|something
T|something2|something2

私も試してみましたtr。それもうまくいきませんでした。


回答:


15

これを使って:

sed 's/|END|/\n/g' test.txt

sedは基本的な正規表現を使用し、sedの実装には\|「or」(BREの一般的な拡張)を意味する演算子が含まれているため、試行した内容は機能しませんEND


\ in \ nをコメント化する必要があります:sed 's / | END | / \\ n / g
Baazigar

@Baazigarいいえ、ABが書いたものは正しいです(少なくともLinuxの場合、sedの実装によってはが発生します\n)。質問では|END|、ではなく改行に置き換える方法を尋ねます\n
Gilles「SO-邪悪なことをやめ

改行の文字は「\ n」です。\もエスケープ文字であるため、\\ nが必要です。したがって、\ nだけを実行する場合は、「このn文字をエスケープする」と言います。すると、\\ n「次の\をエスケープとして扱わないでください。」と言っています。
Baazigar 2015

7

以下は私にとってはうまくいきました:

$ sed 's/|END|/\
/g' foobar
T|somthing|something
T|something2|something2

バックスラッシュに続けてEnterキーを押すだけです。


2
これが標準の構文です。\n @ABの回答のように使用しても、一部のsed実装では機能しません。
ステファンChazelas

@StéphaneChazelasどのsed実装\|が正規表現での代替をサポートしてい\nますが、s置換で改行を意味していませんか?
Gilles「SO-邪悪なことをやめなさい」

5

使用できますawk

$ awk -F'\\|END\\|' '{$1=$1}1' OFS='\n' file
T|somthing|something
T|something2|something2
  • -F'\\|END\\|' フィールド区切りを設定 |END|
  • OFS='\n' 出力フィールドセパレータを改行に設定します
  • $1=$1フィールドセパレータとしてawk再構築$0を引き起こしOFSます
  • 1真の値です。awk入力行全体を印刷します

3

別の可能性があります コマンドとそのRSオプションの使用法は次のとおりです。

awk '$1=$1' RS="\|END\|" file

空ではない(少なくとも1つのフィールドを持つ)それらのレコード(awkのR ecord Sセパレーターに基づく)を印刷して、空の行の印刷を防ぎます。

この入力でテスト:

T|somthing|something|END|T|something2|something2|END|
Test|END|
|END|

この出力を与えます:

T|somthing|something
T|something2|something2
Test

空の行がすべてクリアされました:)改行も必要な場合$1=$1$0、コマンド内ので置き換えてください。

awk '$0' RS="\|END\|" file

$1=$1空白のシーケンスを1つのスペース文字に圧縮し、最初のフィールドが0の場合はfalseを返します。意味がありません。あなたはおそらくしたいawk 1 RS='\\|END\\|'か、awk NF RS='\\|END\\|'またはawk length RS='\\|END\\|'ここに。正規表現のRSはgawkのかのmawk必要なことに注意してください
ステファンChazelas

3

別の方法ではsed、空の行が出力されません。

sed 's/|END|/\
/g;/^$/!P;D' infile

例:入力:

T|one|two|END|T|three|four|END|
T|five|six|END|T|seven|eight|END|
T|nine|ten|END|T|eleven|twelve|END|

出力:

T|one|two
T|three|four
T|five|six
T|seven|eight
T|nine|ten
T|eleven|twelve

同じことed

ed -s infile <<'IN'
1,$j
s/|END|/\
/g
,p
q
IN

1

前述のように、ここウォルターMundt氏、我々は使用してこれを達成することができますANSI C文字列を引用符で囲んで

sed $'s/|END|/\\\n/g'

~ $ echo 'T|somthing|something|END|T|something2|something2|END|' | sed 
$'s/|END|/\\\n/g'
T|somthing|something
T|something2|something2

~ $

その他の代替案については、上記のリンクをご覧ください。

次の構文も使用できます。Unix/ Linuxのすべてのフレーバーで機能するかどうかはわかりません

sed 's/|END|/\'$'\n''/g'

~ $ echo 'T|somthing|something|END|T|something2|something2|END|' | sed 
's/|END|/\'$'\n''/g'
T|somthing|something
T|something2|something2

~ $

FreeBSD v10に取り組んでいます。実際には、私のために働いた唯一の方法。ありがとうございます。
ソパラホデアリエレス

0

私は厳密なposixシェルで同じ問題を抱えていましたが、未使用の文字で2パスで行いました

cat data.json|tr '§' '?'|sed -e 's/"[^"]":/§&/g'|tr '§' '\n'
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.