【问题标题】:insert carriage return before a regular expression in a text file using unix shell使用 unix shell 在文本文件中的正则表达式之前插入回车
【发布时间】:2015-02-14 12:28:36
【问题描述】:

我有一个杂乱的文本文件(大约 30 Ko),其中包含我必须使用 shell 脚本重新组织的数据。 该文件显示了一个简单的模式: “参数编号”(介于 10001 和 10999 之间的值)后跟几个其他值(浮点数)。值由空格分隔。 我希望我的文件是: 在每一行上,一个“参数编号”后跟它的值(一行中只有一个“参数编号”)。值由空格分隔。

我的问题很容易理解:

“凌乱”的文件看起来像这样:

10001 x(1,1) x(1,2) ... x(1,n) 10002 x(2,1) x(2,2) ... x(2,n) 10003 x(3,1) x(3,2) ... x(3,n) [..and so on to..] 10999 x(999,1) x(999,2) ... x(999,n) 

x(i,j) 是浮点数

我希望它是:

10001 x(1,1) x(1,2) ... x(1,n) 
10002 x(2,1) x(2,2) ... x(2,n) 
10003 x(3,1) x(3,2) ... x(3,n) 
...
10999 x(999,1) x(999,2) ... x(999,n) 

我想编写一个 bash 脚本(或简单命令),将模式 10[0-9][0-9][0-9](正则表达式)之前的“空格”替换为回车。

Bash 脚本和正则表达式对我来说是新事物,无法找到简单的解决方案。

我正在考虑使用 bash ${string//substring/newsubstring} 参数扩展,但我仍然不知道如何在正则表达式中说“模式 10[0-9][0-9][0-9] 之前的空格”。

【问题讨论】:

    标签: regex bash shell unix carriage-return


    【解决方案1】:

    想编写一个 bash 脚本(或简单命令),用回车符替换模式 10[0-9][0-9][0-9](正则表达式)之前的“空格”。

    你可以使用 sed。

    sed 's/[[:space:]]\(10[0-9][0-9][0-9]\)/\n\1/g' file
    

    sed 's/ \(10[0-9][0-9][0-9]\)/\n\1/g' file
    

    在基本 sed 中,捕获组由 \(..\) 表示。

    示例:

    $ cat file
    0001 x(1,1) x(1,2) ... x(1,n) 10002 x(2,1) x(2,2) ... x(2,n) 10003 x(3,1) x(3,2) ... x(3,n) [..and so on to..] 10999 x(999,1) x(999,2) ... x(999,n) 
    $ sed 's/[[:space:]]\(10[0-9][0-9][0-9]\)/\n\1/g' file
    0001 x(1,1) x(1,2) ... x(1,n)
    10002 x(2,1) x(2,2) ... x(2,n)
    10003 x(3,1) x(3,2) ... x(3,n) [..and so on to..]
    10999 x(999,1) x(999,2) ... x(999,n) 
    

    【讨论】:

    • 非常感谢这个答案!另一个问题:命令末尾的“\1/g”代表什么?我还想让 Windows 可以读取“回车”,但是当我将“\n”替换为“\r/\n”时会发生错误......(注意:我实际上正在使用 cygwin)
    • 不,它会像 sed 's/[[:space:]]\(10[0-9][0-9][0-9]\)/\r\n\1/g' fileg 是一个修饰符,有助于进行全局匹配。只需尝试使用或不使用 g 修饰符的上述 sed 命令。
    猜你喜欢
    • 1970-01-01
    • 2021-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-01
    • 1970-01-01
    • 2014-10-17
    • 1970-01-01
    相关资源
    最近更新 更多