sed将模式移动到行首

sed将模式移动到行首,sed,Sed,我有一个文本文件,其中有几行文本,我想用sed将模式移动到行的开头。模式是类似于[35/44]的序列 CSV文件和Jupyter uu初学者使用更多Python-数据工具[35/44]。说明 为初学者调用API Python[36/44]。说明 使用\[.\\]我可以匹配该行的[11/31],但我不知道如何将此模式移动到行的开头 [35/44]CSV文件和Jupyter uu初学者更喜欢Python-Data Tools.description [36/44]为初学者调用API uPython

我有一个文本文件,其中有几行文本,我想用sed将模式移动到行的开头。模式是类似于
[35/44]
的序列

CSV文件和Jupyter uu初学者使用更多Python-数据工具[35/44]。说明
为初学者调用API Python[36/44]。说明
使用
\[.\\]
我可以匹配该行的
[11/31]
,但我不知道如何将此模式移动到行的开头

[35/44]CSV文件和Jupyter uu初学者更喜欢Python-Data Tools.description
[36/44]为初学者调用API uPython.description

希望有人能帮助我

您需要捕获匹配的内容以及它之前的内容来进行替换。在
sed
中,
\(…\)
捕获
..
部分中的内容。因此:

sed -e 's/\(.*\)\(\[[^]]*\]\)/\2\1/'
在命令行中使用单引号可以避免使用双反斜杠

如图所示,这将生成:

[35/44]CSV文件和Jupyter uu初学者使用更多Python-数据工具。说明
[36/44]为初学者调用API uPython。说明
如果您想在
[n of m]
信息后添加空格,请添加:

sed -e 's/\(.*\)\(\[[^]]*\]\)/\2 \1/'

请注意,如果行上有两个或多个
[n of m]
序列,则仅移动最后一个序列。此外,搜索不强制要求方括号之间的材料为
[1/2]
(数字编号)。这样做是可能的;不清楚是否值得担心。

您可以使用以下基于POSIX ERE的
sed
命令:

sed-E的/(.[^[:space:]])[[:space:]*(\[[0-9]+of[0-9]+])/\2\1/'文件
详情:

  • -E
    -启用POSIX ERE语法(较少转义)
  • (.[^[:space:]])
    -第1组:任何文本,然后是非空白字符
  • [[:space:][]*
    -零个或多个空格
  • (\[[0-9]+of[0-9]+])
    -第2组:
    [
    ,一个或多个数字,空格,
    ,空格,一个或多个数字,
替换为
\2\1
,即组1值、空格、组2值

见:

s='CSV文件和Jupyter uu初学者使用更多Python-数据工具[35/44]。说明
为初学者调用API Python[36/44]。说明'

sed-E的/(.[^[:space:]])[:space:]*(\[[0-9]+of[0-9]+])/\2\1/'对于显示的示例,请尝试以下内容

awk '
match($0,/\[[^]]*\]/){
  print substr($0,RSTART,RLENGTH),substr($0,1,RSTART-1) substr($0,RSTART+RLENGTH)
}
' Input_file

说明:使用
awk
match
功能在每一行中从
[
]
进行匹配,然后先打印匹配文本的子字符串,然后再打印行的其余值。

注意
sed
不支持非贪婪,因此
*?
不起作用。另见:
awk '
match($0,/\[[^]]*\]/){
  print substr($0,RSTART,RLENGTH),substr($0,1,RSTART-1) substr($0,RSTART+RLENGTH)
}
' Input_file