これまでのところ、ファイルの先頭に行を追加する方法を見つけることができましたが、それはまさに私が望んでいることではありません。例で示します
ファイル内容
some text at the beginning
結果
<added text> some text at the beginning
それは似ていますが、それで新しい行を作成したくありません...
sed
できればこれでやりたいです。
これまでのところ、ファイルの先頭に行を追加する方法を見つけることができましたが、それはまさに私が望んでいることではありません。例で示します
ファイル内容
some text at the beginning
結果
<added text> some text at the beginning
それは似ていますが、それで新しい行を作成したくありません...
sed
できればこれでやりたいです。
回答:
sed
アドレスを操作できます:
$ sed -i '1s/^/<added text> /' file
1s
ここでのすべての答えであなたが見るこの魔法は何ですか?行アドレス指定!。
<added text>
最初の10行を追加しますか?
$ 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
echo
、改行を追加しないようにするポータブルな方法がないためですか?
> file
コマンドに追加することでファイルに"some text at the beginning"
printf '%s' "some text" | cat - filename > tmpfile && mv tmpfile filename
改行だけを挿入するには:
sed '1i\\'
問題:親ディレクトリのベース名を使用して、ファイルの上部にあるファイルにタグを付けます。
つまり、
/mnt/Vancouver/Programming/file1
の上部にタグをfile1
付けProgramming
ます。
ソリューション1-空でないファイル:
bn=${PWD##*/} ## bn: basename
sed -i '1s/^/'"$bn"'\n/' <file>
1s
テキストをファイルの1行目に配置します。
解決策2-空または空でないファイル:
上記のsed
コマンドは、空のファイルでは失敗します。これが/superuser/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コマンドのinが必要であることに注意してください(標準入力を読み取ります。詳細についてはman cat
、を参照してください)。ここでは、printfステートメントの出力を(STDINに)取得し、そのファイルと一時ファイルを作成する必要があると思います。http://www.linfo.org/catの下部にある説明も参照してください。 .html。
ファイルを上書きするときに確認を求められないよう-f
に、mv
コマンドにも追加しました。
ディレクトリを再帰するには:
for file in *; do printf "${PWD##*/}\n" | cat - $file > temp && mv -f temp $file; done
これはパスがスペースで分割されることにも注意してください。そのためのソリューションは他にもあります(たとえば、ファイルグロビング、またはfind . -type f ...
タイプソリューション)。
補遺: Re:私の最後のコメント、このスクリプトでは、パスにスペースが含まれるディレクトリを再帰的に実行できます。
#!/bin/bash
## /programming/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/"
# /superuser/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
ファイルの先頭に行を追加するには:
sed -i '1iText to add\'
非常に簡単な方法があります:
echo "your header" > headerFile.txt
cat yourFile >> headerFile.txt
面白くするためed
に、空のファイルで作業しないという問題がないソリューションを使用します。この質問に対する他の回答と同じように、それをシェルスクリプトに入れることができます。
ed Test <<EOF
a
.
0i
<added text>
.
1,+1 j
$ g/^$/d
wq
EOF
上記のスクリプトは、挿入するテキストを最初の行に追加し、最初の行と2番目の行を結合します。無効な結合によるエラーでedが終了するのを防ぐために、最初にファイルの最後に空白行を作成し、まだ存在する場合は後で削除します。
制限:<added text>
が1つのピリオドと完全に等しい場合、このスクリプトは機能しません。
エイリアスを使用した別のソリューション。init rc / envファイルに追加します。
addtail () { find . -type f ! -path "./.git/*" -exec sh -c "echo $@ >> {}" \; }
addhead () { find . -type f ! -path "./.git/*" -exec sh -c "sed -i '1s/^/$@\n/' {}" \; }
使用法:
addtail "string to add at the beginning of file"
addtail "string to add at the end of file"
sed
。