Sed只合并目录中的某些行

Sed只合并目录中的某些行,sed,Sed,我正在使用sed合并目录中的文本文件行。 命令cd dir&&sed-e'N;s/\n/'*.txt可以很好地实现这一点,但是否有任何方法可以对其进行调整,使其仅将以**开头的行句子与以下以**结尾的句子组合在一起。所以 This is Line1 **This is Line2 This is Line3** This is Line4 This is Line5 变成 This is Line1 ** This is Line2 This is L

我正在使用sed合并目录中的文本文件行。 命令cd dir&&sed-e'N;s/\n/'*.txt可以很好地实现这一点,但是否有任何方法可以对其进行调整,使其仅将以**开头的行句子与以下以**结尾的句子组合在一起。所以

This is Line1    
**This is Line2    
This is Line3**    
This is Line4    
This is Line5 
变成

This is Line1    
** This is Line2 This is Line3**    
This is Line4    
This is Line5 

etc

您可以使用此
sed

sed '/^\*\*/{:loop; N; /\*\*$/{s/\n/ /g;p;d;}; b loop}' file
测试:

$ cat file
This is Line1
**This is Line2
in between
This is Line3**
This is Line4
**This is Line5
This is Line6**

$ sed '/^\*\*/{:loop; N; /\*\*$/{s/\n/ /g;p;d;}; b loop;}' file
This is Line1
**This is Line2 in between This is Line3**
This is Line4
**This is Line5 This is Line6**

您可以使用此
sed

sed '/^\*\*/{:loop; N; /\*\*$/{s/\n/ /g;p;d;}; b loop}' file
测试:

$ cat file
This is Line1
**This is Line2
in between
This is Line3**
This is Line4
**This is Line5
This is Line6**

$ sed '/^\*\*/{:loop; N; /\*\*$/{s/\n/ /g;p;d;}; b loop;}' file
This is Line1
**This is Line2 in between This is Line3**
This is Line4
**This is Line5 This is Line6**
$cat ip.txt
这是一号线
**这是2号线
这是3号线**
这是4号线
这是5号线
$#此文件会将整个文件拖慢
$perl-0777-pe's/^(\*\*.*)\n(.*\*.*)$/$1$2/mg'ip.txt
这是一号线
**这是第二行这是第三行**
这是4号线
这是5号线
$#如果**的测线起点足够,则可以使用此选项
$perl-pe's/\n//if/^\Q**/'ip.txt
参考:

$cat ip.txt
这是一号线
**这是2号线
这是3号线**
这是4号线
这是5号线
$#此文件会将整个文件拖慢
$perl-0777-pe's/^(\*\*.*)\n(.*\*.*)$/$1$2/mg'ip.txt
这是一号线
**这是第二行这是第三行**
这是4号线
这是5号线
$#如果**的测线起点足够,则可以使用此选项
$perl-pe's/\n//if/^\Q**/'ip.txt
参考资料:

塞德是你的朋友

$ sed '/^\*\*/{:l1;/\*\*$/!{N;bl1};s/\n/ /g;}' file
This is Line1

**This is Line2  This is Line3**

This is Line4

This is Line5
塞德是你的朋友

$ sed '/^\*\*/{:l1;/\*\*$/!{N;bl1};s/\n/ /g;}' file
This is Line1

**This is Line2  This is Line3**

This is Line4

This is Line5

sed是针对单个线路的简单补贴,仅此而已。对于其他任何东西,您都应该使用awk。这将完成您在示例输入/输出中显示的内容:

$ awk '{ORS=(/^\*\*/?FS:RS)}1' file
This is Line1
**This is Line2 This is Line3**
This is Line4
This is Line5

但当然,它并没有解决您尚未与我们共享的任何要求(例如,当一行以**开头,但下一行不以**结尾时,或当一行以**开头和结尾时,或当输入文件末尾有以**开头的行或……,该怎么办)。

sed用于对单个行的简单替换,仅此而已。对于其他任何东西,您都应该使用awk。这将完成您在示例输入/输出中显示的内容:

$ awk '{ORS=(/^\*\*/?FS:RS)}1' file
This is Line1
**This is Line2 This is Line3**
This is Line4
This is Line5


但当然,它没有解决您尚未与我们共享的任何需求(例如,当一行以**开头,但下一行不以**结尾时,或者当一行以**开头和结尾,或者输入文件末尾以**开头和结尾时,该怎么办,或者……).

第2行和第3行之间是否有空行,或者只是所示示例中的格式问题?没有空行,只是格式问题。问题是要匹配特殊的2行文本还是特定的行号?祝你好运。只是为了匹配一个特殊的2行文本,我意识到在文件中段落之间有一些空格,但如果这有区别的话,特殊的两行之间没有空格,这些答案对您是否有效?第2行和第3行之间是否有空行,或者只是所示示例中的格式问题?没有空行,只是格式问题。问题是否与特殊的2行文本或特定行号相匹配?祝你好运。为了匹配一个特殊的两行文本,我意识到在文件中,段落之间有一些空格,但如果这有区别的话,在特殊的两行之间没有空格。所以,没有任何答案对你有用吗?当运行命令时,我得到错误代码1“意外EOF(挂起}”。有空行应该保持完整?@NickJ,更新的答案。@sjsam,OP说没有空行。只是格式化。我必须更正我的陈述,在文档的段落之间有空行。运行命令时,我得到错误代码1“意外EOF(挂起}”.有空白行应该保持完整吗?@NickJ,更新的答案。@sjsam,OP说没有空白行。这只是格式。我必须更正我的陈述。文档中段落之间有空行。这更有效。谢谢你是否有办法缩小“这是第2行这是第3行”之间的差距,使其成为一个完整的句子?当然,将
FS
更改为
,但是,如果这是您想要的,那么为什么在您的问题中显示间隙作为所需的输出?我为没有意识到我在上面这样做的混乱道歉。我更深入地研究了awk,为什么当我尝试使用上面的命令保存对实际文件的更改时,而不是使用它继续提示我的>>重定向来保存对stdout的更改输入?您是否在问为什么
命令文件>>文件
(其中
命令
在本例中是awk,但可以是任何命令)不起作用?你希望它能做什么?如果希望将命令的输出写入用作输入的文件,则为
command file>tmp&&mv tmp file
。如果您尝试写入正在读取的同一文件,shell可以执行它喜欢的任何操作,包括在命令从中读取第一行之前清空文件。有些工具(例如perl、GNU-sed、GNU-awk)有“就地编辑”选项,但它们实际上也只是在内部使用tmp文件。这样效果更好。谢谢您,是否有办法缩小“这是第2行这是第3行”之间的差距,使其成为一个完整的句子?当然,将
FS
更改为
,但是,如果这是您想要的,那么为什么在您的问题中显示间隙作为所需的输出?我为没有意识到我在上面这样做的混乱道歉。我更深入地研究了awk,为什么当我尝试使用上面的命令保存对实际文件的更改时,而不是使用它继续提示我的>>重定向来保存对stdout的更改输入?您是否在问为什么
命令文件>>文件
(其中
命令
在本例中是awk,但可以是任何命令)不起作用?你希望它能做什么?如果希望将命令的输出写入用作输入的文件,则为
command file>tmp&&mv tmp file
。如果您尝试写入正在读取的同一文件,shell可以执行它喜欢的任何操作,包括在命令从中读取第一行之前清空文件。有些工具(例如perl、GNU-sed、GNU-awk)可以选择进行“就地编辑”,但它们实际上只使用了一个tmp文件int