如何将多行文本转换为一行?

时间:2011-05-18 20:42:13

标签: bash sed text-processing

我正在尝试将生成的密钥生成一行的txt文件。例如:

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

我希望它看起来像:

lkdjasdjskdjaskdjasdkjskdhfjlkdfjlkdsfjsdlfkkldshfjlsdhjfksdhfksdjjdhsfkjsdhfksdjfhskdfhjhdfkjsdhfkjsdhfkjsdhf

注意我还希望删除行<----- key start -----><----- key stop ----->。我怎样才能做到这一点?这会用sed完成吗?

11 个答案:

答案 0 :(得分:13)

答案 1 :(得分:5)

如果你正在寻找一个sed中你要求的所有东西,我有这个......

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

但它不易读取:)如果你不介意输入几个命令,你可以在你得到的其余答案中使用管道grep,tr,sed等建议。

答案 2 :(得分:4)

要将多行输出转换为单个空格分隔行,请使用

tr '\n' ' ' < key.txt

我知道这不回答详细的问题。但这是一个可能的标题答案。我需要这个答案,我的谷歌搜索发现了这个问题。

答案 3 :(得分:2)

grep '^[^<]' test.txt | tr -d '\n'

答案 4 :(得分:1)

一种简单的方法是使用cat file.txt | tr -d '\n'

答案 5 :(得分:1)

awk '/ key (start|stop) / {next} {printf("%s", $0)} END {print ""}' filename

答案 6 :(得分:0)

在vim中,它只是:%s / ^ M //

我一直用这个来从行生成逗号分隔的列表。对于sed或awk,请查看此链接中的许多解决方案:

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

示例:

paste -s -d','tmpfile | sed's /,/,/ g'

答案 7 :(得分:0)

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

答案 8 :(得分:0)

您也可以使用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

答案 9 :(得分:0)

这可能适合你(GNU sed):

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

收集key startkey stop之间的行。然后删除第一行和最后一行并删除任何换行符。

答案 10 :(得分:0)

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

要删除第一行,请尾巴,最后一行,tr要删除换行符。