【问题标题】:Swapping the first word with itself 3 times only if there are 4 words only using sed仅当仅使用 sed 有 4 个单词时,才将第一个单词与自身交换 3 次
【发布时间】:2017-12-26 12:29:45
【问题描述】:

您好,我正在尝试仅使用 sed 命令而不使用管道来解决问题。但是我可以将 sed 命令的结果传递给文件或从文件中读取。 例如:

sed s/dog/cat/ >| tmp 
or
sed s/dog/cat/ < tmp

无论如何,假设我有一个文件 F1,它的内容是:

Hello hi 123
if a equals b
you
one abc two three four
dany uri four 123

输出应该是:

if if if a equals b
dany dany dany uri four 123

说明:程序必须只打印正好有 4 个单词的行,并且在打印它们时,它必须打印该行的第一个单词 3 次。

我试过这样的命令:

sed '/[^ ]*.[^ ]*.[^ ]*/s/[^ ]\+/& & &/' F1

sed 's/[^ ]\+/& & &/' F1

但我不知道如何使用 sed 计算一行中只有 4 个单词。 任何帮助将不胜感激

【问题讨论】:

    标签: linux unix sed


    【解决方案1】:
    $ sed -En 's/^([^[:space:]]+)([[:space:]]+[^[:space:]]+){3}$/\1 \1 &/p' file
    if if if a equals b
    dany dany dany uri four 123
    

    上面使用了一个支持 ERE 的 sed,带有 -E 选项,例如GNU 和 OSX seds)。

    【讨论】:

    • 我运行了你的命令并得到一个错误:sed: invalid option -- E Usage: sed [OPTION]... {script-only-if-no-other-script} [input-file ]...看起来它不支持这个选项
    • -r 相当于旧版本的 GNU sed 中的 -E ,并且由于 \+ 在您的问题中为您工作,因此您必须运行一个 GNU sed 版本。当您将-E 更改为-r 时,您是否有机会删除了-n
    • @EdMorton 是的,我的错,谢谢您的反馈。 -rn 有效。
    【解决方案2】:

    如果字段是制表符分隔的

    sed 'h;s/[^[:blank:]]//g;s/[[:blank:]]\{3\}//;/^$/!d;x;s/\([^[:blank:]]*[[:blank:]]\)/\1\1\1/' infile
    

    【讨论】:

      猜你喜欢
      • 2011-03-20
      • 1970-01-01
      • 2019-10-28
      • 1970-01-01
      • 2011-09-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多