web-dev-qa-db-ja.com

Wordを新しい行に置き換える方法

次のデータを含むテキストファイルがあり、各行は|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も試してみました。それもうまくいきませんでした。

11
Sas

これを使って:

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

Sedが 基本正規表現 を使用しており、sedの実装に\|演算子は「or」(BREの一般的な拡張)を意味するため、記述した内容(空の文字列またはENDまたは空の文字列)は改行で置き換えられます。

15
A.B.

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

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

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

7
unxnut

awkを使用できます:

$ awk -F'\\|END\\|' '{$1=$1}1' OFS='\n' file
T|somthing|something
T|something2|something2
  • -F'\\|END\\|'フィールド区切りを|END|に設定
  • OFS='\n'出力フィールド区切り文字を改行に設定
  • $1=$1原因awk再構築$0OFSをフィールド区切り文字として
  • 1は真の値、cause awkは入力行全体を出力します
5
cuonglm

別のおそらく 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
3
αғsнιη

空の行を出力しない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
3
don_crissti

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

~ $
1
k_vishwanath

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

cat data.json|tr '§' '?'|sed -e 's/"[^"]":/§&/g'|tr '§' '\n'
0
Benamar