【问题标题】:sed printing first 255 characters followed by entire linesed 打印前 255 个字符,后跟整行
【发布时间】:2014-06-30 14:21:11
【问题描述】:

我想打印前 255 个字符,然后打印整行,用 '^' 字符分隔。

(现在我一次测试 10 个字符而不是 255 个字符。) 例如,这适用于一个大问题:

cat myfile.txt | sed -e 's:^\(.\{10\}\)\(.*\)$:\1^\1\2:'

问题是有些行很短,在这种情况下,我想打印整行两次,用 '^' 字符分隔。

例如:

1234567890987654321
123

应该打印为:

1234567890^1234567890987654321
123^123

我真的不需要使用 sed,但似乎 sed 应该能够做到这一点 - 但任何一行命令都会很好。

【问题讨论】:

    标签: regex shell sed ksh mks


    【解决方案1】:

    它只需要对您的sed 脚本进行几乎微不足道的调整——您希望打印一行的前 N ​​个字符,然后是插入符号和整行,因此您可以使用数字和上界前的逗号:

    sed -e 's:^\(.\{1,10\}\)\(.*\)$:\1^\1\2:'
    

    或(减少反斜杠和记住字符串的数量):

    sed -e 's:^.\{0,10\}:&^&:'
    

    这会将插入符号添加到空行中;带有1,10 的版本将空行留空。

    顺便说一句,Mac OS X sed 在逗号前需要一个数字; GNU sed 遵循传统,不需要它,并将前导缺失的数字视为 0。因此,可移植代码不会写:

    sed -e 's:^.\{,10\}:&^&:'
    

    它适用于 sed 的一些,也许是大多数,但不是所有版本。

    【讨论】:

    • 逗号前没有'0'的行在MKS中也不起作用。
    • @Alex:知道这很有趣——感谢您提供的信息。检查 POSIX,BRE'a 和 '多个匹配字符' 部分不允许省略逗号之前的值,因此有理由省略该选项。
    【解决方案2】:

    您可以使用awk 轻松做到这一点:

    awk '{print substr($0, 1, 10) "^" $0}' file
    1234567890^1234567890987654321
    123^123
    

    【讨论】:

    • 你可以离开 -v 不能你只在 awk 语句中添加 n=10 吗?
    • 您也可以只使用awk '{print substr($0, 1, 10) "^" $0}',因为子字符串无论如何都会在到达行尾时停止:)
    猜你喜欢
    • 2010-10-07
    • 2018-07-07
    • 1970-01-01
    • 2023-03-23
    • 1970-01-01
    • 2022-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多