嗨,我想在文件前添加文字。例如,我想将任务添加到todo.txt文件的开头。我知道,echo 'task goes here' >> todo.txt
但这会将行添加到文件的末尾(不是我想要的)。
嗨,我想在文件前添加文字。例如,我想将任务添加到todo.txt文件的开头。我知道,echo 'task goes here' >> todo.txt
但这会将行添加到文件的末尾(不是我想要的)。
Answers:
echo 'task goes here' | cat - todo.txt > temp && mv temp todo.txt
要么
sed -i '1s/^/task goes here\n/' todo.txt
要么
sed -i '1itask goes here' todo.txt
|
的消息(echo '...'
)管道()。连接多个文件。将输出()发送到名为的文件。如果没有错误()从然后重命名()将文件恢复到原始文件()。cat
-
todo.txt
cat
>
temp
&&
cat
mv
temp
todo.txt
cat
收到字面反斜杠n,它将不会将其转换为换行符。其他必须做的。而不是cat
,请尝试进行管道hexdump -C
传递,以查看您是否实际在发送反斜杠和n或它是否是换行符。您也可以尝试cat -e
显示行尾。
1
方法仅做文件上的一行的下一个命令和i
命令插入。在手册页的“地址”部分和“零地址或单地址命令”部分中查找。
我认为一个更简单的选择是:
echo -e "task goes here\n$(cat todo.txt)" > todo.txt
之所以有效,$(...)
是因为其中的命令是在执行之前todo.txt
被覆盖的> todo.txt
虽然其他答案很好用,但我发现这很容易记住,因为我每天都使用echo和cat。
编辑:如果在中存在任何反斜杠,则此解决方案是一个非常糟糕的主意todo.txt
,因为多亏了-e
标志echo才能解释它们。将换行符添加到序言字符串中的另一种更容易的方法是...
echo "task goes here
$(cat todo.txt)" > todo.txt
...只需使用换行符。当然,它不再是单线的了,但实际上,以前也不是单线的。如果您要在脚本中执行此操作,并且担心缩进(例如,您要在函数内部执行缩进),则有一些变通办法可以使它仍然很合适,包括但不限于:
(echo 'task goes here' && cat todo.txt) > todo.txt
echo 'task goes here'$'\n'"$(cat todo.txt)" > todo.txt
另外,如果您担心是否在末尾添加了换行符todo.txt
,请不要使用它们。好吧,倒数第二个除外。结局没有错。
-e
也不会在todo.txt中转换转义序列吗?
将moreutils
有一个很好的工具,叫做sponge
:
echo "task goes here" | cat - todo.txt | sponge todo.txt
它将“吸收” STDIN,然后写入文件,这意味着您不必担心临时文件和来回移动它们。
您可以moreutils
通过Homebrew通过apt-get install moreutils
或在OS X上获得许多Linux发行版,并带有。brew install moreutils
(echo 'ble'; cat todo.txt)
:-)
您可以创建一个新的临时文件。
echo "new task" > new_todo.txt
cat todo.txt >> new_todo.txt
rm todo.txt
mv new_todo.txt todo.txt
您也可以使用sed
或awk
。但是基本上发生了同样的事情。
new_todo.txt
只能部分写入。您的解决方案似乎丢失了原始文件。
rm
原始文件的命令。
如果文本文件足够小以适合内存,则无需创建临时文件来替换它。您可以将它们全部加载到内存中,然后将其写回到文件中。
echo "$(echo 'task goes here' | cat - todo.txt)" > todo.txt
在不覆盖整个文件的情况下,不可能在文件的开头添加行。
text=$(cat file)
。但是请务必仅使用文本,因为shell变量不是二进制干净的mywiki.wooledge.org/BashFAQ/058
您不能在文件开头插入内容。您唯一可以做的就是替换现有内容或在文件的当前结尾之后追加字节。
然后,对您的问题的任何解决方案都需要创建一个临时文件(或缓冲区)(在内存或磁盘上),该文件最终将覆盖原始文件。
当文件系统在此过程中碰巧已满时,请注意不要在创建新文件时保留原始文件而丢失数据。例如:
cat <(echo task go there) todo.txt > todo.txt.new && mv todo.txt.new todo.txt
echo HOME=\"/g/Users/timregan/\" | cat - 'F:\Program Files\Git\etc\profile'
可以,但是cat <echo HOME=\"/g/Users/timregan/\" 'F:\Program Files\Git\etc\profile'
给出错误“ echo:没有这样的文件或目录”
<
和(
将打破语法。试试cat <(echo HOME=\"/g/Users/timregan/\") 'F:\Program Files\Git\etc\profile'
您可以使用tee
:
echo 'task goes here' | cat - todo.txt | tee todo.txt
GitBash + Windows10 + Multline:
这是一个允许您使用多行字符串的版本。
##############################################
## This section for demo purpose only, ##
## So you can save entire file as ##
## whatever.sh and run it. ##
## ##
##############################################
> MY_TARGET_FILE.txt ##Make Or Clear File
echo "[STARTER_CONTENT]" >> MY_TARGET_FILE.txt
##############################################
## Below is main code:
##################################################
TARGET_FILE_VARIABLE="MY_TARGET_FILE.txt"
ADD_TO_HEAD_VARIABLE=$(cat << "HEREDOC_HEAD_TEXT"
//| +-------------------------------------+ |//
//| | | |//
//| | MESSAGE_FOR_HEAD_OF_FILE | |//
//| | | |//
//| +-------------------------------------+ |//
HEREDOC_HEAD_TEXT
)
##################################################
TAR=$TARGET_FILE_VARIABLE ##
TEX=$ADD_TO_HEAD_VARIABLE ##
echo "$TEX" | cat - $TAR > TEMP && mv TEMP $TAR ##
##################################################
## Expected contents of MY_TARGET_FILE.txt :
## //| +-------------------------------------+ |//
## //| | | |//
## //| | MESSAGE_FOR_HEAD_OF_FILE | |//
## //| | | |//
## //| +-------------------------------------+ |//
## [STARTER_CONTENT]