web-dev-qa-db-ja.com

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

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

line1
line2
line3

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

prefixline1
prefixline2
prefixline3

私はRubyスクリプトを書くことができましたが、私がする必要がないならそれはより良いです。

prefix/を含みます。これはパスです(/opt/workdir/など)。

285
pierrotlefou
# 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/'
452
Alok Singhal
awk '$0="prefix"$0' file > new_file

Perlでは(代わりの場所で):

Perl -pi 's/^/prefix/' file
111
Vijay

ExモードでVimを使うことができます。

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

  2. sname__を置き換える

  3. xname__保存して閉じます

30
Steven Penny

接頭辞が少し複雑な場合は、単にそれを変数に入れてください。

prefix=path/to/file/

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

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

あなたがPerlを持っているならば:

Perl -pe 's/^/PREFIX/' input.file
9
Majid Azimi

シェルを使う

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

Pierrがこの懸念を抱いているとは思いませんが、複数のアラートログを同時に監視し、各行の先頭にそれぞれのログの名前を付けたいので、ファイルのライブ「末尾」からの出力を遅らせないソリューションが必要でした。 。

残念なことに、sed、cutなどは、あまりにも多くのバッファリングをもたらし、私が最新の行を見ることを妨げました。 nl-sオプションを使用するというSteven Pennyの提案は興味深かったし、テストはそれが私に関係している望ましくないバッファリングを導入しなかったことを証明しました。

ただし、不要な行番号を削除したいという願望に関連して、nlを使用する際に問題がいくつかありました(たとえそれが美観を気にかけなくても、余分な列を使用するのが望ましくない場合がある)。 。まず、数値を削除するために "cut"を使用すると、バッファリングの問題が再発生するため、解決策が破綻します。次に、 " - w1"を使用しても意味がありません。これは行番号を1列に制限しないためです。桁数が増えるにつれて幅が広くなります。

あなたが他の場所でこれを捉えたいのであればそれほど美しくはありませんが、それは私がする必要がなかったことです(すべてはすでにログファイルに書き込まれていました。行番号を失い、私のプレフィックスだけを持つ方法は、キャリッジリターン(CRまたは^ MまたはCtrl-M)で-s文字列を開始することでした。だから、例えば:

#!/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}
2
ScriptGuy

これは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
1
navigaid

Edを使う:

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

これは、各行(,)に対して、行の先頭(^)をprefixに置き換えます。 wqは保存して終了します。

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

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

パラメータ展開を防ぐため、here-doc区切り文字EOE( "end of ed")を引用しました。この例では、引用符で囲まれていなくても動作しますが、edスクリプトに$がある場合は、驚きを防ぐことをお勧めします。

1
Benjamin W.

lamと呼ばれる標準のunixユーティリティがあり、ラミネートの略です。 lam -s prefix fileはあなたが望むことをするでしょう。私はパイプラインでそれを使用します、例えば:

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

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

0
Ray

これが この答え からの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
0
Brad Parks