用 sed 替换包含模式的行

dov*_*vah 3 sed

如何用 sed 替换与模式匹配的行中的给定字符?

例如:我想匹配以字母开头的每一行,并用制表符替换末尾的换行符。我正在尝试使用:(sed -e '/^[A-Z]/s/\n/\t/g'我感兴趣的行也总是以字母结尾,如果这有帮助的话)。

样本输入

NAME_A
12,1
NAME_B
21,2
Run Code Online (Sandbox Code Playgroud)

样本输出

NAME_A    12,1
NAME_B    21,2
Run Code Online (Sandbox Code Playgroud)

mik*_*erv 7

sed '/^[[:alpha:]]/{$!N;s/\n/       /;}' <<\DATA
NAME_A
12,1
NAME_B
21,2
DATA
Run Code Online (Sandbox Code Playgroud)

输出

NAME_A  12,1
NAME_B  21,2
Run Code Online (Sandbox Code Playgroud)

它寻址以字母开头的行,如果有,则拉入下一个,并用制表符替换换行符。

请注意,该s/\n/<tab>/位在此处包含一个文字制表符,尽管某些seds 也可能支持\t在其位置进行转义

要处理递归情况,您需要使其更加健壮,如下所示:

sed '$!N;/^[[:alpha:]].*\n[^[:alpha:]]/s/\n/    /;P;D' <<\DATA
NAME_A
NAME_B
12,1  
NAME_C
21,2
DATA
Run Code Online (Sandbox Code Playgroud)

输出

NAME_A
NAME_B  12,1
NAME_C  21,2
Run Code Online (Sandbox Code Playgroud)

它总是在前面一行的数据集上滑动。如果两^[[:alpha:]]行接连出现,它不会错误地替换换行符,如您所见。