これまでのところ、ファイルの先頭に行を追加する方法を見つけることができましたが、それは私が望むことではありません。例で見てみましょう
ファイル内容
some text at the beginning
結果
<added text> some text at the beginning
似ていますが、新しい行を作成したくないのですが….
可能であれば、これをsed
で行います。
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,}
ファイルの先頭に行を追加したい場合は、上記の最善の解決策では文字列の末尾に\n
を追加する必要があります。
最善の解決策は文字列を追加することですが、文字列を使用すると、ファイルの末尾に行を追加しません。
sed -i '1s/^/your text\n/' file
ファイルが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
インプレース編集を行います。
あなたはcat -
を使うことができます
printf '%s' "some text at the beginning" | cat - filename
改行だけを挿入するには:
sed '1i\\'
OS Xではsed -i <pattern> file
は失敗します。ただし、バックアップ拡張子sed -i old <pattern> file
を指定した場合、file.old
の作成中にfile
がその場で変更されます。その後、スクリプト内のfile.old
を削除できます。
問題:ファイルの先頭に、親ディレクトリのベース名でファイルをタグ付けします。
つまり、
/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
非常に簡単な方法があります。
echo "your header" > headerFile.txt
cat yourFile >> headerFile.txt
改行付きでこんにちは。
sed -i '1s/^/your text\n/' file
ファイルの先頭に行を追加するには
sed -i '1iText to add\'
念のため、空のファイルを扱わないという問題のないed
を使用した解決策を示します。この質問に対する他の答えと同じように、それをシェルスクリプトに入れることができます。
ed Test <<EOF
a
.
0i
<added text>
.
1,+1 j
$ g/^$/d
wq
EOF
上記のスクリプトは、挿入するテキストを最初の行に追加してから、1行目と2行目を結合します。無効な結合でエラーが発生してもedが終了しないようにするために、まずファイルの末尾に空白行を作成し、後でまだ存在する場合は削除します。
制限:<added text>
が単一のピリオドに正確に等しい場合、このスクリプトは機能しません。
echo -n "text to insert " ;tac filename.txt| tac > newfilename.txt
最初のtac
はファイルを逆方向にパイプして(最後の行が最初)、「挿入するテキスト」が最後に表示されます。 2番目のtac
はそれをもう一度ラップするので、挿入された行は先頭にあり、元のファイルは元の順序になっています。
私の2セント:
sed -i '1i /path/of/file.sh' filename
これはスラッシュを含む文字列でも機能します"/"
サブシェルを使う:
echo "$(echo -n 'hello'; cat filename)" > filename