AWK - SED - 数字で始まる場合は、各列の先頭に文字を追加します。

AWK - SED - 数字で始まる場合は、各列の先頭に文字を追加します。

数字で始まる各列の先頭に文字を追加するには:

追加例c:
4 r4 8 8 4

だから私は次のような結果を得ます:
c4 r4 c8 c8 c4

さまざまな数の列に対して機能する必要があります。

答え1

あなたはそれを使用することができます各列を一度に変更します。

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

フィールド区切り文字が空白でない場合は、(^| )正規表現のこの部分のスペースをフィールド区切り文字に置き換えます。

  • -Eデフォルトの正規表現(BRE)の代わりに拡張正規表現(ERE)を使用するように指定します。
  • s:s/regexp/replacement/
  • (^| )キャプチャリンググループの行の先頭またはスペースに一致します。
  • ([[:digit:]])キャプチャグループの数値一致
  • \1c\2最初のキャプチャグループの内容(\1)、文字c、2番目のキャプチャグループの内容(\2
  • gグローバル

結果が満足で実装がサポートされている場合は、FreeBSDやmacosなどの派生に追加してファイルを変更sedできます。 (元のファイルをバックアップしたい場合)-i-i ''-i.bak

答え2

私は次のように-onelinerを使用しますawk

  • 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

以下は、Perlシリーズのプログラミング言語であるRakuで書いた答えです。上記では、ファイルは1行ずつ自動印刷フラグを使用して読み取られます-pe。交換は:gグローバルで、次のとおりです。 」行の先頭^または\s+スペースの後に\d数字が続く場合は、それを置き換えます。 」

<(…)>最初の例では、Rakuのキャプチャタグを使用して、スペースの後ろの一致を削除しました。結果$/一致オブジェクトが代替出力され、その後に文字が表示されますc。 2番目の例では、一致はすべて2つのキャプチャ($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変数スペース()にあり、各列がaで始まる列に入力\s+され、aが一致の前に追加されます(ここではmatch-objectまたはを使用して)。一致が定義されていない場合(Rakuの「define-OR」演算子を使用)、何も挿入されません。返された列の間にスペースがあります。mapsubst^\dc$/$0//""

https://docs.raku.org/言語/regexes#Regexes
https://raku.org

答え4

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

関連情報