As far as I know there is no prepend operator on a bash or any other shell, however there are many ways to do the same. You can use ed, sed, perl, awk and so on to add text to the beginning of a file in Bash under Linux or Unix-like systems.
Bash prepend a text using a temporary file
Here is simple solution using a temporary file to prepend text:
echo 'line 1' > /tmp/newfile echo 'line 2' >> /tmp/newfile cat yourfile >> /tmp/newfile cp /tmp/newfile yourfile
Here is one line solution:
echo "text"|cat - yourfile > /tmp/out && mv /tmp/out yourfile echo "nixCraft"|cat - yourfile > /tmp/out && mv /tmp/out yourfile
Prepending A Text or Lines To a File Under Linux and Unix
Using bash only solution to add text to the beginning of a file
No need to create a temp file. The syntax is:
echo -e "DATA-Line-1\n$(cat input)" > input cat input
To add multiple lines:
echo -e "DATA-Line-1\nDATA-Line-2\n$(cat input)" > input cat input
For example add text to the beginning of a text file called input using bash as follows:
cat input echo -e "Famous Quotes\n$(cat input)" > input
Use sed command to prepend data to a text file
The syntax is follows to prepend A text or lines to a file when we use the sed command:
sed '1s;^;DATA-Line-1\n;' input > output ## GNU/sed syntax ## sed -i '1s;^;DATA-Line-1\n;' input ## Verify it using the cat ## cat input
Here is a sample input file:
$ cat input.txt This is a test file. I love Unix.
Next prepend two lines (make sure you add \n):
$ sed -i '1s;^;Force-1\nForce-2\n;' input.txt $ cat input.txt Force-1 Force-2 This is a test file. I love Unix.
How do I prepend a string to the beginning of each line in a file?
The awk command syntax is:
awk '{print "Line-1" $0}' file ## add a new line for each matched line ## awk '{print "~~~~~~~~\n" $0}' quotes.txt > output.txt
Display result using the [nicmd name=”cat”] or grep command/egrep command:
$ cat output.txt
The sed syntax is:
sed -i -e 's/^/Line-1/' file
Examples
Here is our sample file:
$ cat data.txt Maybe I'm crazy Maybe you're crazy Maybe we're crazy Probably
Use the sed or awk as follows:
$ sed -i -e 's/^/DATA-Here/' data.txt $ cat data.txt DATA-HereMaybe I'm crazy DATA-HereMaybe you're crazy DATA-HereMaybe we're crazy DATA-HereProbably
Conclusion
You learned how to prepend a text or lines to a file when using bash and other command-line utilities. See sed,awk, and bash command man pages for more info using the man command:
$ man bash
$ man sed
$ man awk
🐧 Get the latest tutorials on Linux, Open Source & DevOps via:
- RSS feed or Weekly email newsletter
- Share on Twitter • Facebook • 41 comments... add one ↓
Category | List of Unix and Linux commands |
---|---|
File Management | cat |
Firewall | Alpine Awall • CentOS 8 • OpenSUSE • RHEL 8 • Ubuntu 16.04 • Ubuntu 18.04 • Ubuntu 20.04 |
Network Utilities | dig • host • ip • nmap |
OpenVPN | CentOS 7 • CentOS 8 • Debian 10 • Debian 8/9 • Ubuntu 18.04 • Ubuntu 20.04 |
Package Manager | apk • apt |
Processes Management | bg • chroot • cron • disown • fg • jobs • killall • kill • pidof • pstree • pwdx • time |
Searching | grep • whereis • which |
User Information | groups • id • lastcomm • last • lid/libuser-lid • logname • members • users • whoami • who • w |
WireGuard VPN | Alpine • CentOS 8 • Debian 10 • Firewall • Ubuntu 20.04 |
perl -p -i -e 'BEGIN { print "First line\n" }' originalfile
should work without needing an explicit temp file
If you’re going to use these commands in a script, though, “man mktemp” first.
Sean
Even simpler would be:
sed -i '1i Prepended line' /tmp/newfile
+1 This works very nice and without using temporally files.
Works, but it _does_ use a temporary file behind the covers.
The following is from the info document:
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
That works on linux but not in solaris (unless you install gsed package), because de solaris sed command doesnt support “in place option” -i.
In that case
echo "text"|cat - yourfile > /tmp/out && mv /tmp/out yourfile
works for me
Thanks for help :)
Yes it does. The `-i` option is a mandatory part of POSIX, so it will work on any UNIX that takes itself seriously, Solaris included.
It just works differently, i.e. GNU sed allows you to omit the argument of the `-i` flag, as was done in the example, whereas most other seds require it.
Try:
sed -i.bak '1i Prepended line' /tmp/newfile
Now hang your head in shame.
Ok, I was wrong on the POSIX part, I will hang my head in shame.
..but the missing flag argument is probably still the reason the example didn’t work on Solaris.
Yes, that worked very nicely for me in Linux armel 2.6.32-rc5, sed is great but if you don’t use it regularly for a month it’s RTFM every time. Thanks.
Excellent suggestion with `sed` very good.
You can also use tac (cat backwards) to make it work. It will print the file from end to beginning.
Thread’s old, I know, but I wanted to note that tac -- at least in the version I have in Cygwin, is not fully “cat in reverse” alas.
As you say, it’ll print from the end — but it won’t take an argument like this:
tac >> somefilethatyouwanttoPREPENDtextto
Just thought I’d note that for others who might be searching the same issue as the OP.
This seems like such an obviously useful utility it’s unbelievable what a pita it is.
I tried the perl command (same one suggested to me by someone on IRC) and it didn’t work. It just printed to stdout and left the file unchanged. I’m kind of surprised two different people suggested the exact same non-working command, so I must be doing something wrong. What could I be doing wrong though??
I like the sed command, but I needed to add more than one line (and my text contained special characters).
This worked for me:
I’m not even really sure how it works, I just combined bits of code from a couple of random scripts I saw elsewhere. I should learn more sed :-P
this also worked:
tac your_file prepended_text | tac > your_new_file
tac does not add a damn thing.
Given this command:
— I get the error
tac: cannot open `thisistext’ for reading: No such file or directory.
Considering it’s a close cousin of cat, I shouldn’t expect it to do any more, logically.
Please do the newbie world a favour and remove any references to tac in this thread.
BZT
You need to put your prepend data into the file “thisistext”. Also, unless you want your file to come out upside down, you’ll have to pipe the output from the first tac into a second tac before redirecting to a file.
With a little creative use of shell commands, you can avoid needing a second input file. Passing ‘-‘ as an argument tells most tools to use standard input or output (whichever applies) as a file.
echo "my_prepend_text_goes_here" | tac biglist.txt - | tac > biglist5.txt
There are a couple of tricks where you can avoid needing to create biglist5.txt in the process (storing results to a variable or using “tee” to write your output), but I can’t find anything that will work on large files.
This is clever; even simpler, you can use
echo “prepend this” | cat – file.txt > newfile.txt
How about a command or script to add the same text to every line OF a file, not just to the file itself???
Believe it or not
bash prepend same text to beginning of all lines of file
does not have an exact match on Google. Ask.com and Yahoo! were sloppy with it (read:inexact and wide of the mark ultimately). Just more proof to my assertion that the world is going stupid.
BZT
This can be done with sed in place (a pretty scary operation):
sed -i -e 's/^/PREFIX/' file_with_lines_to_prefix.txt
Thanks, Q. I’ve attempted something similar in the past without success.
This perl one-liner will prefix (not prepend, which isn’t a word) a line to the beginning of a file.
perl -pi -e 'print "Put before first line\n" if $. == 1' inFile.txt
(from the perl FAQ):
You got gypped on your dictionary if it doesn’t have prepend.
http://www.dict.org/bin/Dict?Form=Dict2&Database=*&Query=prepend
It’s also in the Merriam-Webster Unabridged Dictionary, which is more authoritative at the cost of a subscription, and it’s even a command in the popular jQuery javascript library. However, I agree prefix would be more proper English if one cares and has an educated audience that would not be confused.
You’ll have to copy and paste the url, as the link parser cannot handle it.
‘prepend’ is a corollary to ‘append’, which is an English word.
Ugh, my original message totally got garbled…
What the above SHOULD look like:
From http://sed.sourceforge.net/grabbag/tutorials/sedfaq.txt:
This can be used to insert a file into any line but the last one into a second file. For instance, to insert file1 into file2 at line 10:
Edited by Admin – added formatting html tags
You could generate a patch file and use patch.
diff -u <(head myfile) mypatch; patch mypatch
That got completely mangled. Is there any way to protect my comments?
My finally correct version (may I request a preview feature?):
Let’s try again.
Another method is using ed:
A variation on this is:
echo “0r header.txt
w” | ed myfile.txt
Thanks, works well…
This is the best (sed) one-liner that I found for this problem:
sed -i -e '1i TEXT' FILE
Above command will insert string TEXT into the first line of the file FILE.
echo "MAINCARD_MSISDN,SUB_SOC,EXPIRY_DATE,S,U," | cat - $spoolFile > /tmp/out && mv /tmp/out $spoolFile
that line above works for. problem is if a have to run the script more than once. it will insert the same line again.. Any way to stop it?
thanks
Its worth mentioning that
echo -e "DATA-Line-1\n$(cat input)" > input
Is very ineficient and works only for small files, the larger files (e.g. 800Mb) crash the terminal and leave the file empty.
echo -e "DATA-Line-1\n$(cat input)" > input
dose not always work
This is the only sed syntax that works for me on OSX Sierra:
sed -i_bak '1s;^;prepended text ;' test.file
Thanks, I’d been looking for an hour.
Thanks, this pointed me to just what I needed! I wanted to point out that your “Bash Only” way doesn’t need to be bash only – instead of using
$(cat input)
, use`cat input`
(use the backtick character). It does the same thing as$()
in bash, but it works in most shells :DThank you
“sed -i '1s;^;DATA-Line-1\n;' input” worked great!
Just what I needed