各行に特定の単語を追加する

各行に特定の単語を追加する

ここにはfile.txtのようなファイルがあります。

bbb-ccc-cccc#
   aasdf  asdas asdasa fgdg
   asdfa  asfdas  adfaq  asfa
   afdaf  fafa  fafd  afafa
bbb-ccc-cccc#

#次に終わる単語を取り、各行の最初の単語として追加したいと思います。

sed 's/bbb-ccc-cccc#/^/' < file.txt > newfile.txt

#記号の前の単語を事前に知らないので、私のポイントはで終わる単語を見つけて各行の先頭#に入れることです。この file.txt には次のものが必要です。

bbb-ccc-cccc#
bbb-ccc-cccc#   aasdf  asdas asdasa fgdg
bbb-ccc-cccc#   asdfa  asfdas  adfaq  asfa
bbb-ccc-cccc#   afdaf  fafa  fafd  afafa
bbb-ccc-cccc#

答え1

そしてperl

perl -lpe 'if (/\H+#/) {$word = $&} else {$_ = $word . $_}'

つまり、1行で空白以外の文字(\H+)の後にaが続く場合は、そのシーケンス(正規表現に一致するもの)を次の行の先頭に挿入する単語として使用します。#$&

awk同じ

awk '
  match($0, /[^[:blank:]]+#/) {
    word = substr($0, RSTART, RLENGTH)
    print
    next
  }
  {print word $0}'

sed(使用してスペアスペース保存する言葉):

sed '
  /[^[:blank:]]\{1,\}#/ {
    h; # save the line in the hold space
    s//\
&\
/; # put newlines on each side of the matched word
    s/.*\n\(.*\)\n/\1/; # remove every thing but the word
    x; # swap hold and pattern space so that now the hold
       # space contains the word. And branch off:
    b
  }
  # for the other lines:
  G; # append the hold space to the pattern space
  s/\(.*\)\n\(.*\)/\2\1/; # move the word to the beginning'

word#行の終わりにのみsを一致させるには、上記の3つのコマンドをすべてwithに置き換えます##$

答え2

使用awk:

$ awk '/^[^ ]*#$/ { prefix = $0; print; next } { print prefix, $0 }' file
bbb-ccc-cccc#
bbb-ccc-cccc#    aasdf  asdas asdasa fgdg
bbb-ccc-cccc#    asdfa  asfdas  adfaq  asfa
bbb-ccc-cccc#    afdaf  fafa  fafd  afafa
bbb-ccc-cccc#

これにより、プレフィックスを含むすべての行が印刷されます。プレフィックスは、パターンに一致するすべての行^[^␣]*#$、つまり空白以外の文字でのみ完全に整理され、で終わる行から取得されます#。この行は接頭辞を付けずに印刷され、次の入力行で処理が続行されます。

答え3

これが私の解決策ですgnu sed

sed '/\(.*\)#/{h;:y;n;/\(.*\)#/b;G;s/\(.*\)\n\(.*\)/\2\1/;by}' test.txt

簡単な説明:

  • h は、現在のバッファを「予約済みスペース」にコピーします。
  • Gは現在のバッファに「予約済みスペース」を追加します(削除する必要があるキャリーリターンを追加します)。
  • :xxxはラベルです。
  • bxxxは後藤です。 "b"だけがスクリプトの終わりに達しました
  • n 現在のバッファを印刷し、次の行を読み込みます。

私のbashソリューションは次のとおりです。

while IFS='' read -r x;do if [[ "$x" = *# ]] ; then if [ "$p" = "$x" ]; then p=''; else p="$x"; x=''; fi ; fi; printf '%s%s\n' "$p" "$x";done < test.txt

答え4

バッシュから:

#!/bin/bash

# grab one of the lines ending in #
prefix=$(egrep '#$' file | head -1)

cat file | while read line
do
    # if the line ends in a #, just print it
    if [[ $line =~ \#$ ]]
    then
        echo $line
    else
        # print the line prefixed with the $prefix
        printf -- "%s %s\n" "$prefix" "$line"
    fi
done

[[ $line =~ \#$ ]]は正規表現のif文ですegrep。シェルが気に入らない場合に置き換えることができますif egrep -q '#$' <<< line; then

関連情報