Help needed to add text to the end of a string using the "sed" command in Terminal
In Terminal.app, I used the curl ftp
... command to get a directory listing of folders and files from my friend's computer and I directed the output to a file called "curlFTP.txt". Each line of this file appears like these following 3 examples…
- drwxr-xr-x 1 nobody root 4096 Aug 02 2014 WEDDING_SINGER_4X3
- drwxr-xr-x 1 nobody root 4096 Aug 02 2014 WEEKEND_AT_BERNIES
- drwxr-xr-x 1 nobody root 4096 Aug 02 2014 WEIRD_SCIENCE
From each of these lines of that file, I only need to keep the directory names, which would be...
- WEDDING_SINGER_4X3
- WEEKEND_AT_BERNIES
- WEIRD_SCIENCE
Using the cut -c 52-
command, I was able to extract only these folder names which I then directed its output to a file I named "curlFTP2.txt"
The next step I needed to do was prepend each line of the file "curlFTP2.txt" with the text...curl ftp://1.1.1.1/Disk\ 1\ Movies/Movies\ 1/
and direct its output to a file named "curlFTP3.txt". Now each line of the file "curlFTP3.txt" would look like these following three examples...
curl ftp://1.1.1.1/Disk 1 Movies/Movies 1/WEDDING_SINGER_4X3
curl ftp://1.1.1.1/Disk 1 Movies/Movies 1/WEEKEND_AT_BERNIES
curl ftp://1.1.1.1/Disk 1 Movies/Movies 1/WEIRD_SCIENCE
Here is the full command I used, which worked incredibly well and was extremely fast, considering there was 760 lines in the file to edit.
cat curlFTP.txt | cut -c 52- > curlFTP2.txt ; sed 's|^|curl ftp://1.1.1.1/Disk\ 1\ Movies/Movies\ 1/|g' curlFTP2.txt > curlFTP3.txt
(the IP address I used in this is a substitute for the IP address I actually used)
Here is where I'm jammed up… what I need to do is use the sed
command with the -e
argument so I can add an additional sed
command to the code from above and add a "/" to the end of each line of that file because each listing is a directory.
I need each line to look like this: curl ftp://1.1.1.1/Disk 1 Movies/Movies 1/WEDDING_SINGER_4X3/
Instead of each line looking like: curl ftp://1.1.1.1/Disk 1 Movies/Movies 1/WEDDING_SINGER_4X3
I was able to figure out that using the sed 's|^|blah|g'
command, for example, the "^" character would mean adding "blah" to the beginning of each line.
So here is my question… is there a similar character I can use, like the "^" character, that would allow me to use the sed
command to add text to the end of each line?
So here is my question… is there a similar character I can use, like the "^" character, that would allow me to use the sed command to add text to the end of each line?
Yes, it is: $
That said, looking at what is is going on, let me offer you a different over all solution where you do not need to first:
cat curlFTP.txt | cut -c 52- > curlFTP2.txt
You can process the curlFTP.txt
file directly and completely with sed
:
sed -E -e 's|^.*[A-Za-z]{3}[ ][0-9]{2}[ ][0-9]{4}[ ]|curl ftp://1.1.1.1/Disk 1 Movies/Movies 1/|' -e 's|$|/|' curlFTP.txt > newfile.txt
You could even eliminate > newfile.txt
by using the -i
option of the sed
command:
−i extension
Edit files in-place, saving backups with the specified extension. If a zero-length extension is given, no backup will be saved. It is not recommended to give a zero-length extension when in-place editing files, as you risk corruption or partial content in situations where disk space is exhausted, etc.
sed -i'.bak' -E -e 's|^.*[A-Za-z]{3}[ ][0-9]{2}[ ][0-9]{4}[ ]|curl ftp://1.1.1.1/Disk 1 Movies/Movies 1/|' -e 's|$|/|' curlFTP.txt
Using https://regex101.com to explain the regex used in the sed
command:
Which matches e.g.:
drwxr-xr-x 1 nobody root 4096 Aug 02 2014