trazinaz
trazinaz

Reputation: 11

Replacing 1 character with sed

I am trying to process a change of a specific character with regex using sed.

Essentially I am running a bash script that is renaming files that have a specific string and I need to keep this string mostly constant. Here is an example file name:

_FILE20210714.023.jpg

So I am trying to create a variable nfile that is used for the mv command and will convert it to the following:

_FILE20210714.123.jpg

Keep in mind that I only want to change the last 0 to a 1.

I came up with the following regex to grab that specific character, but I'm lost on how to substitute with sed:

_FILE\d{8}\.\K0

nfile=$(echo ${file}| sed -e 's/_FILE\d{8}\.\K0/_FILE\d{8}\.\K1/')

when i then echo the nfile variable i get the original name and i'm not sure how to resolve this.

echo ${file}
echo ${nfile}
/home/user/_FILE20210714.023.jpg
/home/user/_FILE20210714.023.jpg

So essential once I can substitute the 023 to 123 I'm set only problem is I have multiple files that end in like .034.jpg so I can't direct string match it.

Upvotes: 0

Views: 473

Answers (3)

glenn jackman
glenn jackman

Reputation: 246807

If you have the perl rename on your system, you'd write

rename -v 's/\.0(\d+\.jpg)$/.1$1/' *.jpg

Since you tagged

newname () {
    local parts=() IFS="."
    read -ra parts <<< "$1"
    parts[1]="1${parts[1]#0}"
    echo "${parts[*]}"
}

for file in *.jpg; do
    mv -v "$file" "$(newname "$file")"
done

Upvotes: 0

markp-fuso
markp-fuso

Reputation: 34409

For this particular case a simple parameter substitution should suffice:

for file in '_FILE20210714.023.jpg' '/home/user/_ACH20210714.023.jpg'
do
    nfile="${file//.0/.1}"
    echo "######################"
    echo " file: ${file}"
    echo "nfile: ${nfile}"
done

This generates:

######################
 file: _FILE20210714.023.jpg
nfile: _FILE20210714.123.jpg
######################
 file: /home/user/_ACH20210714.023.jpg
nfile: /home/user/_ACH20210714.123.jpg

Upvotes: 0

Barmar
Barmar

Reputation: 780994

sed doesn't support the \d escape sequence, you need to use [0-9].

Unless you use the -E option, you have to escape {} quantifiers.

sed doesn't support \K, but I don't think it's needed here.

You need to use a capture group to copy the digits from the original name to the replacement.

nfile=$(echo "${file}"| sed -E -e 's/(_FILE[0-9]{8}\.)0/\11/')

Upvotes: 1

Related Questions