web-dev-qa-db-ja.com

複数行のテキストを1行に変換するにはどうすればよいですか?

生成されたキーを含むtxtファイルを1行にしようとしています。例:

<----- key start ----->
lkdjasdjskdjaskdjasdkj
skdhfjlkdfjlkdsfjsdlfk
kldshfjlsdhjfksdhfksdj
jdhsfkjsdhfksdjfhskdfh
jhdfkjsdhfkjsdhfkjsdhf
<----- key stop ----->

私はそれを次のように見せたい:

lkdjasdjskdjaskdjasdkjskdhfjlkdfjlkdsfjsdlfkkldshfjlsdhjfksdhfksdjjdhsfkjsdhfksdjfhskdfhjhdfkjsdhfkjsdhfkjsdhf

<----- key start -----><----- key stop ----->の行も削除したいことに注意してください。これどうやってするの?これはsedで行われますか?

15
john
14
Luke

あなたが1つのsedであなたが求めたすべてを探しているなら、私はこれを持っています...

sed -n '1h;2,$H;${g;s/\n//g;s/<----- key \(start\|stop\) ----->//g;p}' key.txt

しかし、正確に読みやすいわけではありません:)いくつかのコマンドをパイプ処理してもかまわない場合は、残りの回答でパイプ接続されたgrep、tr、sedなどの提案を使用できます。

5
Costa

複数行の出力を単一のスペースで区切られた行に変換するには、

tr '\n' ' ' < key.txt

私はこれが詳細な質問に答えないことを知っています。しかし、それはタイトルに対する1つの可能な答えです。私はこの答えが必要でした、そして私のグーグル検索はこの質問を見つけました。

4
Axel Bregnsbo
grep '^[^<]' test.txt | tr -d '\n'
2
Daniel Haley
awk '/ key (start|stop) / {next} {printf("%s", $0)} END {print ""}' filename
1
glenn jackman

簡単な方法は、cat file.txt | tr -d '\n'を使用することです。

1
kuriouscoder
tail -n +2 key.txt | head -n -1 | tr -d '\n'

テールで最初の行を削除し、headで最後の行を削除し、trで改行を削除します。

0
JavierY

これはあなたのために働くかもしれません(GNU sed):

sed -r '/key start/{:a;N;/key stop/!ba;s/^[^\n]*\n(.*)\n.*/\1/;s/\n//g}' file

key startkey stopの間の行を収集します。次に、最初と最後の行を削除し、改行を削除します。

0
potong
grep  -v -e "key start" -e "key stop" /PATH_TO/key | tr -d '\n'
0
freethinker

man 1 edを使用して行を結合することもできます。

str='
aaaaa
<----- key start ----->
lkdjasdjskdjaskdjasdkj
skdhfjlkdfjlkdsfjsdlfk
kldshfjlsdhjfksdhfksdj
jdhsfkjsdhfksdjfhskdfh
jhdfkjsdhfkjsdhfkjsdhf
<----- key stop ----->
bbbbb
'


# for in-place file editing use "ed -s file" and replace ",p" with "w"
# cf. http://wiki.bash-hackers.org/howto/edit-ed
cat <<-'EOF' | sed -e 's/^ *//' -e 's/ *$//' | ed -s <(echo "$str")
   H
   /<----- key start ----->/+1,/<----- key stop ----->/-1j
   /<----- key start ----->/d
   /<----- key stop ----->/d
   ,p
   q
EOF


# print the joined lines to stdout only
cat <<-'EOF' | sed -e 's/^ *//' -e 's/ *$//' | ed -s <(echo "$str")
   H
   /<----- key start ----->/+1,/<----- key stop ----->/-1jp
   q
EOF
0
karl

Vimでは、それはただ:%s/^ M //

私はこれを常に使用して、行からコンマ区切りのリストを生成します。 sedまたはawkについては、次のリンクで多くのソリューションを確認してください。

http://www.unix.com/Shell-programming-scripting/35107-remove-line-break.html

例:

貼り付け-s-d '、' tmpfile | sed's /、/、/ g '

0
Milimetric