web-dev-qa-db-ja.com

ファイルの先頭にテキストを挿入する方法

これまでのところ、ファイルの先頭に行を追加する方法を見つけることができましたが、それは私が望むことではありません。例で見てみましょう

ファイル内容

some text at the beginning

結果

<added text> some text at the beginning

似ていますが、新しい行を作成したくないのですが….

可能であれば、これをsedで行います。

179
user219882

sedはアドレスを操作できます。

$ sed -i '1s/^/<added text> /' file

あなたがここにすべての答えで見るこの魔法の1sは何ですか? 行アドレス指定

最初の10行に<added text>を追加しますか?

$ sed -i '1,10s/^/<added text> /' file

あるいは Command Grouping を使うこともできます。

$ { echo -n '<added text> '; cat file; } >file.new
$ mv file{.new,}
269
kev

ファイルの先頭に行を追加したい場合は、上記の最善の解決策では文字列の末尾に\nを追加する必要があります。

最善の解決策は文字列を追加することですが、文字列を使用すると、ファイルの末尾に行を追加しません。

sed -i '1s/^/your text\n/' file
28
Ali Reza Ebadat

ファイルが1行しかない場合は、次のものを使用できます。

sed 's/^/insert this /' oldfile > newfile

複数行の場合の一つ:

sed '1s/^/insert this /' oldfile > newfile
sed '1,1s/^/insert this /' oldfile > newfile

あなたが行の範囲をどうやってやるかがわかるように、私は後者を含めました。どちらも影響を受けた行の開始行マーカーを挿入したいテキストに置き換えます。また、(あなたのsedが十分に近代的であると仮定して)使用することもできます。

sed -i 'whatever command you choose' filename

インプレース編集を行います。

26
paxdiablo

あなたはcat -を使うことができます

printf '%s' "some text at the beginning" | cat - filename
9
Lex

改行だけを挿入するには:

sed '1i\\'
9
user4427511

OS Xではsed -i <pattern> fileは失敗します。ただし、バックアップ拡張子sed -i old <pattern> fileを指定した場合、file.oldの作成中にfileがその場で変更されます。その後、スクリプト内のfile.oldを削除できます。

5
Curt Clifton

問題:ファイルの先頭に、親ディレクトリのベース名でファイルをタグ付けします。

つまり、

/mnt/Vancouver/Programming/file1

file1の先頭をProgrammingでタグ付けします。

解決策1 - 空でないファイル:

bn=${PWD##*/}    ## bn: basename

sed -i '1s/^/'"$bn"'\n/' <file>

1sは、ファイルの1行目にテキストを配置します。

解決策2 - 空のファイルまたは空でないファイル:

上記のsedコマンドは、空のファイルでは失敗します。これは https://superuser.com/questions/246837/how-do-i-add-text-to-the-beginning-of-a-file-in-に基づく解決策です。 bash/246841#246841

printf "${PWD##*/}\n" | cat - <file> > temp && mv -f temp <file>

Catコマンドの-が必要であることに注意してください(標準入力を読み取ります:詳細についてはman catを参照してください)。ここでは、私は、それは(STDINに)printfステートメントの出力を取る必要があり、それを一時的にファイルと猫... http://の下部にある説明も参照してくださいwww.linfo.org/cat.html .

ファイルを上書きするときに確認を求められるのを避けるために、mvコマンドに-fを追加しました。

ディレクトリを再帰するには:

for file in *; do printf "${PWD##*/}\n" | cat - $file > temp && mv -f temp $file; done

これはスペースを含むパスを分割することにも注意してください。それらに対する解決策は他にもあります(例えばファイルグロビングやfind . -type f ...タイプの解決策)。

補遺:再:私の最後のコメント、このスクリプトでは、パスにスペースを含むディレクトリを再帰できるようになります。

#!/bin/bash

## https://stackoverflow.com/questions/4638874/how-to-loop-through-a-directory-recursively-to-delete-files-with-certain-extensi

## To allow spaces in filenames,
##   at the top of the script include: IFS=$'\n'; set -f
##   at the end of the script include: unset IFS; set +f

IFS=$'\n'; set -f

# ----------------------------------------------------------------------------
# SET PATHS:

IN="/mnt/Vancouver/Programming/data/claws-test/corpus test/"

# https://superuser.com/questions/716001/how-can-i-get-files-with-numeric-names-using-ls-command

# FILES=$(find $IN -type f -regex ".*/[0-9]*")        ## recursive; numeric filenames only
FILES=$(find $IN -type f -regex ".*/[0-9 ]*")         ## recursive; numeric filenames only (may include spaces)

# echo '$FILES:'                                      ## single-quoted, (literally) prints: $FILES:
# echo "$FILES"                                       ## double-quoted, prints path/, filename (one per line)

# ----------------------------------------------------------------------------
# MAIN LOOP:

for f in $FILES
do

  # Tag top of file with basename of current dir:
  printf "[top] Tag: ${PWD##*/}\n\n" | cat - $f > temp && mv -f temp $f

  # Tag bottom of file with basename of current dir:
  printf "\n[bottom] Tag: ${PWD##*/}\n" >> $f
done

unset IFS; set +f
3
Victoria Stuart

非常に簡単な方法があります。

echo "your header" > headerFile.txt
cat yourFile >> headerFile.txt
3

改行付きでこんにちは。

sed -i '1s/^/your text\n/' file
2
xck

ファイルの先頭に行を追加するには

sed -i '1iText to add\'
2
solidsnack

念のため、空のファイルを扱わないという問題のないedを使用した解決策を示します。この質問に対する他の答えと同じように、それをシェルスクリプトに入れることができます。

ed Test <<EOF
a

.
0i
<added text>
.
1,+1 j
$ g/^$/d
wq
EOF

上記のスクリプトは、挿入するテキストを最初の行に追加してから、1行目と2行目を結合します。無効な結合でエラーが発生してもedが終了しないようにするために、まずファイルの末尾に空白行を作成し、後でまだ存在する場合は削除します。

制限:<added text>が単一のピリオドに正確に等しい場合、このスクリプトは機能しません。

1
merlin2011
echo -n "text to insert " ;tac filename.txt| tac > newfilename.txt

最初のtacはファイルを逆方向​​にパイプして(最後の行が最初)、「挿入するテキスト」が最後に表示されます。 2番目のtacはそれをもう一度ラップするので、挿入された行は先頭にあり、元のファイルは元の順序になっています。

1
paulp

私の2セント:

sed  -i '1i /path/of/file.sh' filename

これはスラッシュを含む文字列でも機能します"/"

1
vardhan

サブシェルを使う:

echo "$(echo -n 'hello'; cat filename)" > filename
1
Nick Roz