AWK - SED - 如果以数字开头,则在每列的开头添加一个字符

AWK - SED - 如果以数字开头,则在每列的开头添加一个字符

如何在以数字开头的每列的开头添加一个字符:

添加 a 的示例c
4 r4 8 8 4

所以我得到这个输出:
c4 r4 c8 c8 c4

它应该适用于可变数量的列。

答案1

您可以使用一次修改每一列:

sed -E 's/(^| )([[:digit:]])/\1c\2/g' input

如果您的字段分隔符不是空格,请将(^| )正则表达式这部分中的空格替换为您的字段分隔符。

  • -E指定使用扩展正则表达式 (ERE) 而不是基本正则表达式 (BRE)
  • s:s/regexp/replacement/
  • (^| )匹配捕获组中行的开头或空格
  • ([[:digit:]])匹配捕获组中的数字
  • \1c\2第一个捕获组的内容 ( \1)、字符c、第二个捕获组的内容 ( \2)
  • g全球

一旦结果令您满意并且您的sed实现支持它,您可以添加-i-i ''在 FreeBSD 或诸如 macos 等衍生版本上)来就地修改文件。 (-i.bak如果您想备份原始文件)

答案2

我会使用awk这样的 -oneliner:

  • echo '4 r4 8 8 4' | awk '{ for (i=1; i<=NF; i++) if ($i ~ /^[0-9]/) $i = "c" $i }1'

希望有帮助:)

答案3

使用(以前称为 Perl_6)

~$ raku -pe 's:g / <(^ | \s+)> \d  /{$/}c/;'  file

#OR

~$ raku -pe 's:g /  (^ | \s+) (\d) /$0c$1/;'  file

以下是用 Raku(Perl 编程语言家族的成员)编写的答案。上面,使用逐行自动打印标志读取文件-pe。替换将是:g全球性的,并表示:“如果遇到行首^\s+空格后跟\d数字,则进行替换。”

<(…)>在第一个示例中,使用 Raku 的捕获标记删除空格后的匹配。生成的$/匹配对象在替换中输出,后跟字母c。在第二个示例中,整个匹配包含在两个捕获 ($0$1) 中,并在替换中输出为$0c$1

输入示例:

4 r4 8 8 4

示例输出:

c4 r4 c8 c8 c4

或者(更明确地),下面将“规范”列之间的空白:

~$ raku -ne 'put .split(/ \s+ /).map: *.subst(/^ \d /, {"c$/" // ""});'  file

#OR

~$ raku -ne 'put .split(/ \s+ /).map: *.subst(/^ (\d) /, {"c$0" // ""});'   file

首先,输入行位于.split变量空白 ( \s+) 上,然后将每一列输入map到以开头的subst任何列,并在匹配之前添加 a (此处使用match-object 或)。如果匹配未定义(使用 Raku 的“定义-OR”运算符),则不插入任何内容。返回的列之间有一个空格。^\dc$/$0//""

https://docs.raku.org/language/regexes#Regexes
https://raku.org

答案4

    echo "4 r4 8 8 4" | sed -E 's/\<([[:digit:]])/c\1/g'

相关内容