各行の先頭にプレフィックス文字列を追加します


333

次のようなファイルがあります。

line1
line2
line3

そして私は取得したいです:

prefixline1
prefixline2
prefixline3

Rubyスクリプトを作成することもできますが、必要がない場合はそれをお勧めします。

prefix含まれます//opt/workdir/たとえば、パスです。

回答:


525
# If you want to edit the file in-place
sed -i -e 's/^/prefix/' file

# If you want to create a new file
sed -e 's/^/prefix/' file > file.new

prefix含む場合/、にない他の文字を使用するかprefix、をエスケープ/できるため、sedコマンドは次のようになります。

's#^#/opt/workdir#'
# or
's/^/\/opt\/workdir/'

1
@benjamin、私はすでにあなたの答えを支持していましたが、私はsedこのような軽量のタスクを好みます。「接頭辞」がわかっている場合、「接頭辞」以外の文字を選択するのは非常に簡単です。
Alok Singhal、2010年

1
sedパイプラインでも使用できることを忘れないでくださいfoo | sed -e 's/^/x /' | bar
zigg

1
@Datamanかっこいい。別の方法になりますsed -e '2,$s/^/prefix/'
Alok Singhal

1
@BinChenは(単一引用符で囲まれた文字列内)または(二重引用符で囲まれた文字列内)の/ようにエスケープします\/\\/

8
sed -e 's/$/postfix/' file各行の終わりに文字列を追加する場合に使用します。
ブライアン

121
awk '$0="prefix"$0' file > new_file

Perl(インプレース置換)の場合:

perl -pi 's/^/prefix/' file

8
パイプ/ストリームまたは変数を使用:prtinf "$VARIABLE\n" | awk '$0="prefix"$0'
ThorSummoner '25

2
大きなファイル(12 G)の場合、awkレポートawk: out of memory in readrec 1 source line number 1は表示されますが、ソリューションはsed正常に完了します。
jrm 2017

33

VimはExモードで使用できます。

ex -sc '%s/^/prefix/|x' file
  1. % すべての行を選択

  2. s 取り替える

  3. x 保存して閉じます


1
私にとっては、ファイルをvimとtypeで開くだけです。:%s/^/prefix/これは、この戦略が多くの状況で役立つためです
フランクブライス

23

プレフィックスが少し複雑な場合は、変数に入れてください。

prefix=path/to/file/

次に、その変数を渡して、awkで処理します。

awk -v prefix="$prefix" '{print prefix $0}' input_file.txt


6

シェルを使用する:

#!/bin/bash
prefix="something"
file="file"
while read -r line
do
 echo "${prefix}$line"
done <$file > newfile
mv newfile $file

5

以下は、moreutilsのtsコマンドを使用した、非常に読みやすいonelinerソリューションです。

$ cat file | ts prefix | tr -d ' '

そして、それがどのように段階的に導出されたか:

# Step 0. create the file

$ cat file
line1
line2
line3
# Step 1. add prefix to the beginning of each line

$ cat file | ts prefix
prefix line1
prefix line2
prefix line3
# Step 2. remove spaces in the middle

$ cat file | ts prefix | tr -d ' '
prefixline1
prefixline2
prefixline3

'ts'は、デフォルトでは多くのLinuxディストリビューションにインストールされていません。また、この回答の末尾の「tr -d ''」は、「ts」によって追加されたスペースだけでなく、すべてのスペースを行から削除するため
Tim Bird

3

私はpierrにこの懸念があったとは思いませんが、複数のアラートログを同時に監視し、各行にそれぞれのログの名前を付けたいため、ファイルのライブ「テール」からの出力を遅延させないソリューションが必要でした。

残念ながら、sed、cutなどを使用すると、バッファリングが多くなりすぎて、最新の行を表示できなくなりました。の-sオプションを使用するためのスティーブンペニーの提案nlは興味をそそられ、テストによって、私に関係する不要なバッファリングが導入されないことが証明されました。

nlただし、不要な行番号を削除したいという要望に関連して、の使用にはいくつかの問題がありました(見た目を気にしなくても、余分な列の使用が望ましくない場合があります)。最初に、「カット」を使用して数値を取り除くと、バッファリングの問題が再び発生するため、ソリューションが破壊されます。次に、「-w1」を使用しても効果はありません。これは、行番号が1つの列に制限されないためです。必要な桁数が増えると、幅が広くなります。

これを別の場所にキャプチャしたい場合、それはきれいではありませんが、それはまさに私がする必要がなかったものだからです(すべてが既にログファイルに書き込まれていたので、リアルタイムでいくつかを一度に見たかっただけです)。行番号を失い、接頭辞のみを付ける方法は、-s文字列を改行(CRまたは^ MまたはCtrl-M)で開始することでした。だから例えば:

#!/bin/ksh

# Monitor the widget, framas, and dweezil
# log files until the operator hits <enter>
# to end monitoring.

PGRP=$$

for LOGFILE in widget framas dweezil
do
(
    tail -f $LOGFILE 2>&1 |
    nl -s"^M${LOGFILE}>  "
) &
sleep 1
done

read KILLEM

kill -- -${PGRP}

1
-uバッファリングを回避するには、sed のオプションを使用します。
ブライアンラーセン、

2
バッファリングは、アンバッファ/ stdbuf、参照してオフにすることができunix.stackexchange.com/q/25372/6205
myroslav

2

edの使用:

ed infile <<'EOE'
,s/^/prefix/
wq
EOE

各ラインのこの代替、( ,)、ライン(の先頭^で)prefixwq保存して終了します。

置換文字列にスラッシュが含まれている場合は、s代わりに別の区切り文字を使用できます。

ed infile <<'EOE'
,s#^#/opt/workdir/#
wq
EOE

EOEパラメータの展開を防ぐために、ヒアドキュメントの区切り文字( "end of ed")を引用しました。この例では、引用符なしでも機能$しますが、edスクリプトにが含まれている場合は、驚きを防ぐことをお勧めします。


2

&(パターンに一致した入力全体)を使用:)

cat in.txt | sed -e "s/.*/prefix&/" > out.txt

または後方参照を使用して:

cat in.txt | sed -e "s/\(.*\)/prefix\1/" > out.txt

2
  1. 後方参照技術を使用してこれを達成することもできます

    sed -i.bak 's/\(.*\)/prefix\1/' foo.txt
    
  2. このようなawkでも使用できます

    awk '{print "prefix"$0}' foo.txt > tmp && mv tmp foo.txt
    

1

この回答のsedアプローチを使用したラップされた例を次に示します

$ cat /path/to/some/file | prefix_lines "WOW: "

WOW: some text
WOW: another line
WOW: more text

prefix_lines

function show_help()
{
  IT=$(CAT <<EOF
    Usage: PREFIX {FILE}

    e.g.

    cat /path/to/file | prefix_lines "WOW: "

      WOW: some text
      WOW: another line
      WOW: more text
  )
  echo "$IT"
  exit
}

# Require a prefix
if [ -z "$1" ]
then
  show_help
fi

# Check if input is from stdin or a file
FILE=$2
if [ -z "$2" ]
then
  # If no stdin exists
  if [ -t 0 ]; then
    show_help
  fi
  FILE=/dev/stdin
fi

# Now prefix the output
PREFIX=$1
sed -e "s/^/$PREFIX/" $FILE

2
PREFIXスラッシュのようなsedに特別な文字が含まれている場合、これは機能しません。
josch

良い点...スラッシュをたくさん使用している場合は、ここ詳しく説明するように、sed部分に別の区切り文字を使用できます。これにより、検索で使用できます。その他の特別なsedの文字は、スラッシュでエスケープすることで挿入できます。例:prefix_lines \*
Brad Parks

0

BSD / OSXシステムを使用している人のlamために、ラミネートの略であると呼ばれるユーティリティがあります。lam -s prefix fileあなたがしたいことをします。私はそれをパイプラインで使用します、例えば:

find -type f -exec lam -s "{}: " "{}" \; | fzf

...すべてのファイルを検索し、それぞれにexec lamを実行して、各ファイルに独自のファイル名のプレフィックスを付けます。(そして、出力をfzfにポンプして検索します。)


私はUbuntu 19.10を使用していますが、そのようなコマンドはありません
nafg

そうですね、これはBSD専用のコマンドのようです。POSIXはそれをペーストに置き換えましたが、ペーストには完全なセパレーター文字列を追加する機能がありません。回答を更新します。
Ray
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.