使用 sed 拆分或连接 Linux 中的行
Split or join lines in Linux using sed
我有包含以下信息的文件
$ cat test.txt
Studentename:Ram
rollno:12
subjects:6
Highest:95
Lowest:65
Studentename:Krish
rollno:13
subjects:6
Highest:90
Lowest:45
Studentename:Sam
rollno:14
subjects:6
Highest:75
Lowest:65
我正在尝试单身学生的地点信息。
即我的输出应该是
Studentename:Ram rollno:12 subjects:6 Highest:95 Lowest:65
Studentename:Krish rollno:13 subjects:6 Highest:90 Lowest:45
Studentename:Sam rollno:14 subjects:6 Highest:75 Lowest:65.
下面是我写的命令
cat test.txt | tr "\n" " " | sed 's/Lowest:[0-9]\+/Lowest:[0:9]\n/g'
以上命令在正则表达式最低处换行:[0-9] 但它不打印模式。相反,它正在打印 Lowest:[0-9].
请帮忙
尝试使用 awk :
awk '{if ( !~ /^Lowest/) {printf "%s ", [=10=]} else {print}}' file.txt
或更短但更模糊:
awk '!~/^Lowest/{printf"%s ",[=11=];next}1' file.txt
或更正您的命令:
tr "\n" " " < file.txt | sed 's/Lowest:[0-9]\+/&\n/g'
解释:&
是替换左边匹配的内容
尝试:
$ sed '/^Studente/{:a; N; /Lowest/!ba; s/\n/ /g}' test.txt
Studentename:Ram rollno:12 subjects:6 Highest:95 Lowest:65
Studentename:Krish rollno:13 subjects:6 Highest:90 Lowest:45
Studentename:Sam rollno:14 subjects:6 Highest:75 Lowest:65
工作原理
/^Studente/{...}
告诉 sed 仅在以 Studente
开头的行上执行大括号内的命令。这些命令是:
:a
这定义了一个标签a
.
N
这将读取下一行并将其附加到模式 space。
/Lowest/!ba
如果当前模式 space 不包含 Lowest
,这会告诉 sed 分支回到标签 a
.
更详细地说,如果该行包含 Lowest
,则 /Lowest/
为真。在 sed 中,!
是否定,所以 /Lowest/! is true if the line does not contain
Lowest. In
ba, the
bstands for the branch command and
a` 是要分支到的标签。
s/\n/ /g
这告诉 sed 用 spaces 替换所有换行符。
另一个可能的 GNU sed
不假设 最低 是最后一项:
sed ':a; N; /\nStudent/{P; D}; s/\n/ /; ba' test.txt
这可能对你有用 (GNU sed):
sed '/^Studentename:/{:a;x;s/\n/ /gp;d};H;$ba;d' file
使用保留 space 收集字段,然后删除换行符以生成记录。
我有包含以下信息的文件
$ cat test.txt
Studentename:Ram
rollno:12
subjects:6
Highest:95
Lowest:65
Studentename:Krish
rollno:13
subjects:6
Highest:90
Lowest:45
Studentename:Sam
rollno:14
subjects:6
Highest:75
Lowest:65
我正在尝试单身学生的地点信息。 即我的输出应该是
Studentename:Ram rollno:12 subjects:6 Highest:95 Lowest:65
Studentename:Krish rollno:13 subjects:6 Highest:90 Lowest:45
Studentename:Sam rollno:14 subjects:6 Highest:75 Lowest:65.
下面是我写的命令
cat test.txt | tr "\n" " " | sed 's/Lowest:[0-9]\+/Lowest:[0:9]\n/g'
以上命令在正则表达式最低处换行:[0-9] 但它不打印模式。相反,它正在打印 Lowest:[0-9].
请帮忙
尝试使用 awk :
awk '{if ( !~ /^Lowest/) {printf "%s ", [=10=]} else {print}}' file.txt
或更短但更模糊:
awk '!~/^Lowest/{printf"%s ",[=11=];next}1' file.txt
或更正您的命令:
tr "\n" " " < file.txt | sed 's/Lowest:[0-9]\+/&\n/g'
解释:&
是替换左边匹配的内容
尝试:
$ sed '/^Studente/{:a; N; /Lowest/!ba; s/\n/ /g}' test.txt
Studentename:Ram rollno:12 subjects:6 Highest:95 Lowest:65
Studentename:Krish rollno:13 subjects:6 Highest:90 Lowest:45
Studentename:Sam rollno:14 subjects:6 Highest:75 Lowest:65
工作原理
/^Studente/{...}
告诉 sed 仅在以 Studente
开头的行上执行大括号内的命令。这些命令是:
:a
这定义了一个标签
a
.N
这将读取下一行并将其附加到模式 space。
/Lowest/!ba
如果当前模式 space 不包含
Lowest
,这会告诉 sed 分支回到标签a
.更详细地说,如果该行包含
Lowest
,则/Lowest/
为真。在 sed 中,!
是否定,所以/Lowest/! is true if the line does not contain
Lowest. In
ba, the
bstands for the branch command and
a` 是要分支到的标签。s/\n/ /g
这告诉 sed 用 spaces 替换所有换行符。
另一个可能的 GNU sed
不假设 最低 是最后一项:
sed ':a; N; /\nStudent/{P; D}; s/\n/ /; ba' test.txt
这可能对你有用 (GNU sed):
sed '/^Studentename:/{:a;x;s/\n/ /gp;d};H;$ba;d' file
使用保留 space 收集字段,然后删除换行符以生成记录。