I have two files: masterlist.txt
that has hundreds of lines of URLs, and toupdate.txt
that has a smaller number of updated versions of lines from the masterlist.txt
file that need to be replaced.
I'd like to be able to automate this process using Bash, since the creation and utilisation of these lists is already occuring in a bash script.
The server part of the URL is the part that changes, so we could match using the unique part: /whatever/whatever_user.xml
, but how to find and replace those lines in masterlist.txt
? i.e. how to go through each line of toupdate.txt
and as it ends in /f_SomeName/f_SomeName_user.xml
, find that ending in masterlist.txt
and replace that whole line with the new one?
So https://123456url.domain.com/26/path/f_SomeName/f_SomeName_user.xml
becomes https://new-123.domain.com/1/path/f_SomeName/f_SomeName_user.xml
for example.
The rest of masterlist.txt
needs to stay intact, so we must only find and replace lines that have different servers for the same line endings (IDs).
Structure
masterlist.txt
looks like this:
https://123456url.domain.com/26/path/f_SomeName/f_SomeName_user.xml
https://456789url.domain.com/32/path/f_AnotherName/f_AnotherName_user.xml
https://101112url.domain.com/1/path/g_SomethingElse/g_SomethingElse_user.xml
https://222blah11.domain.com/19/path/e_BlahBlah/e_BlahBlah_user.xml
[...]
toupdate.txt
looks like this:
https://new-123.domain.com/1/path/f_SomeName/f_SomeName_user.xml
https://foo-254.domain.com/8/path/g_SomethingElse/g_SomethingElse_user.xml
Desired Result
Make masterlist.txt
look like:
https://new-123.domain.com/1/path/f_SomeName/f_SomeName_user.xml
https://456789url.domain.com/32/path/f_AnotherName/f_AnotherName_user.xml
https://foo-254.domain.com/8/path/g_SomethingElse/g_SomethingElse_user.xml
https://222blah11.domain.com/19/path/e_BlahBlah/e_BlahBlah_user.xml
[...]
Initial workup
I've looked at sed
but I don't know how to do the find and replace using lines from the two files?
Here's what I have so far, doing the file handling at least:
#!/bin/bash
#...
while read -r line; do
# there's a new link on each line
link="${line}"
# extract the unique part from the end of each line
grabXML="${link##*/}"
grabID="${grabXML%_user.xml}"
# if we cannot grab the ID, then just set it to use the full link so we don't have an empty string
if [ -n "${grabID}" ]; then
identifier=${grabID}
else
identifier="${line}"
fi
## the find and replace here? ##
# we're done when we've reached the end of the file
done < "masterlist.txt"
question from:
https://stackoverflow.com/questions/65862573/bash-find-and-replace-lines-in-a-file-using-the-lines-of-another-file 与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…