如何用 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)
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>/
位在此处包含一个文字制表符,尽管某些sed
s 也可能支持\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:]]
行接连出现,它不会错误地替换换行符,如您所见。