次のデータを含むテキストファイルがあり、各行は|END|
で終わります。
T|somthing|something|END|T|something2|something2|END|
|END|
を\n
の新しい行でsedに置き換えようとしています。
sed 's/\|END\|/\n/g' test.txt
しかし、それは以下のような間違った出力を生成しています:
T
|
s
o
m
e
...
しかし、私が欲しいのはこれです:
T|somthing|something
T|something2|something2
tr
も試してみました。それもうまくいきませんでした。
これを使って:
sed 's/|END|/\n/g' test.txt
Sedが 基本正規表現 を使用しており、sedの実装に\|
演算子は「or」(BREの一般的な拡張)を意味するため、記述した内容(空の文字列またはEND
または空の文字列)は改行で置き換えられます。
以下は私にとってはうまくいきました:
$ sed 's/|END|/\
/g' foobar
T|somthing|something
T|something2|something2
バックスラッシュに続けてEnterキーを押すだけです。
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
は真の値、cause awk
は入力行全体を出力します別のおそらく awk コマンドとそのRS
オプションの使用は次のようになります:
awk '$1=$1' RS="\|END\|" file
それらのレコードを出力します(awkの[〜#〜] r [〜#〜]ecord[〜#に基づいて) 〜] s [〜#〜]eparator)は空ではありません(少なくとも1つのフィールドがあります)。
この入力でテスト:
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
空の行を出力しない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
hereWalter 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
~ $
私は厳密なposixシェルで同じ問題を抱えていましたが、未使用のcharを使用して2パスで行いました
cat data.json|tr '§' '?'|sed -e 's/"[^"]":/§&/g'|tr '§' '\n'