次のデータを含むテキストファイルがあります。各行は|END|
。
T|somthing|something|END|T|something2|something2|END|
|END|
新しい行をsedに置き換えよ\n
うとしています。
sed 's/\|END\|/\n/g' test.txt
ただし、以下のように誤った出力が生成されます。
T
|
s
o
m
e
...
しかし、私が望むのはこれです。
T|somthing|something
T|something2|something2
私もそれを試しましたtr
。それも動作しません。
答え1
これを使用してください:
sed 's/|END|/\n/g' test.txt
sedが使用しているので、試してみるのはうまくいきません基本正規表現、そしてsed実装には\|
「または」(BREの一般的な拡張)を意味する演算子があるので、作成する内容は改行(空文字列またはEND
空文字列)に置き換えられます。
答え2
以下は私にとってうまくいきます。
$ sed 's/|END|/\
/g' foobar
T|somthing|something
T|something2|something2
Enterキーの後にバックスラッシュを追加しました。
答え3
あなたはそれを使用することができます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
入力行全体が印刷されます。
答え4
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