grep using a variable (Solved)

interpretive language scripts


Moderator: Forum moderators

Post Reply
User avatar
AntonioPt
Posts: 219
Joined: Wed Aug 11, 2021 7:41 pm
Has thanked: 99 times
Been thanked: 37 times

grep using a variable (Solved)

Post by AntonioPt »

Hello all im trying to achive some but for some stupid reason i don't get it what im doing wrong maybe some geek in bash can explain it for me
Thxx in advance

So my issue is

Code: Select all

#!/bin/bash

export SCRIPT_PATH="$(dirname $(readlink -f $0))"
export a="\\\[Desktop Entry\\\]"
export b="\\\[Desktop Action Window\\\]"
export c="\\\[Desktop Action Document\\\]"

export reg_1="(?s).*"

FP="${SCRIPT_PATH}/apps/sublime_text.desktop"
# LIKE THIS BOTH WAYS WORKS

line="\[Desktop Entry\](?s).*\[Desktop Action Window\](?s).*\[Desktop Action Document\](?s).*"
line="\[Desktop Entry\]${reg_1}\[Desktop Action Window\]${reg_1}\[Desktop Action Document\]${reg_1}"
grep -Poz "${line}" ${FP}

# using the loop it will not work
cnt=0
while read line ; do
	if [ "$(sed -r "s/(.)/\1\n/g" <<< $line | sort | uniq | wc -l)" -eq 4 ] ; then
		echo "linha => $line "  # DEBUG LINE AND GIVES ME THE RIGHT OUTPUT
		grep -Poz "$line" ${FP} # BUT ON THE OTHER HAND GREP WONT DISPLAY NUTTING
		if [ ! -z "$( grep -oPz "`echo ${line}`" ${FP} )" ] ; then
			echo "cnt = $cnt"
			echo "cnt = $line"
		fi
	fi
	cnt=$((cnt+1))
done <<<"$(echo -e {0..2}{0..2}{0..2}"\n")" | sed -r "s/0/${a}${reg_1}/ ; s/1/${b}${reg_1}/ ; s/2/${c}${reg_1}/"

Last edited by Flash on Tue Nov 19, 2024 3:04 am, edited 1 time in total.
Reason: Added "Solved" to subject line

Why astronauts use Linux
Because you can't open windows in space

HerrBert
Posts: 357
Joined: Mon Jul 13, 2020 6:14 pm
Location: Germany, NRW
Has thanked: 18 times
Been thanked: 126 times

Re: grep using a variable

Post by HerrBert »

AntonioPt wrote: Sat Nov 16, 2024 8:36 pm

Hello all im trying to achive some but for some stupid reason i don't get it what im doing wrong maybe some geek in bash can explain it for me
Thxx in advance

So my issue is

Code: Select all

#!/bin/bash

export SCRIPT_PATH="$(dirname $(readlink -f $0))"
export a="\\\[Desktop Entry\\\]"
export b="\\\[Desktop Action Window\\\]"
export c="\\\[Desktop Action Document\\\]"

export reg_1="(?s).*"

FP="${SCRIPT_PATH}/apps/sublime_text.desktop"
# LIKE THIS BOTH WAYS WORKS

line="\[Desktop Entry\](?s).*\[Desktop Action Window\](?s).*\[Desktop Action Document\](?s).*"
line="\[Desktop Entry\]${reg_1}\[Desktop Action Window\]${reg_1}\[Desktop Action Document\]${reg_1}"
grep -Poz "${line}" ${FP}

# using the loop it will not work
cnt=0
while read line ; do
	if [ "$(sed -r "s/(.)/\1\n/g" <<< $line | sort | uniq | wc -l)" -eq 4 ] ; then
		echo "linha => $line "  # DEBUG LINE AND GIVES ME THE RIGHT OUTPUT
		grep -Poz "$line" ${FP} # BUT ON THE OTHER HAND GREP WONT DISPLAY NUTTING
		if [ ! -z "$( grep -oPz "`echo ${line}`" ${FP} )" ] ; then
			echo "cnt = $cnt"
			echo "cnt = $line"
		fi
	fi
	cnt=$((cnt+1))
done <<<"$(echo -e {0..2}{0..2}{0..2}"\n")" | sed -r "s/0/${a}${reg_1}/ ; s/1/${b}${reg_1}/ ; s/2/${c}${reg_1}/"

Well, i'm not the geek you're waiting for. But at first sight there's two things that look terribly wrong to me...
<<<"$(echo -e {0..2}{0..2}{0..2}"\n")" | sed -r "s/0/${a}${reg_1}/ ; s/1/${b}${reg_1}/ ; s/2/${c}${reg_1}/" echoes the numbers in a HERE string to the loop and pipes the output thru sed to replace the numbers with variables $a $b $c, so your grep search pattern will be the numbers from HERE string and will never match.
sed -r "s/(.)/\1\n/g" <<< $line puts a newline after each character. This will never result in 4 after | sort | uniq | wc -l, except you echo a three digit number with a leading space to the loop.

User avatar
AntonioPt
Posts: 219
Joined: Wed Aug 11, 2021 7:41 pm
Has thanked: 99 times
Been thanked: 37 times

Re: grep using a variable

Post by AntonioPt »

@HerrBert i found the solution and less hard work thxx for the tips,.... soon i hope to share my full code and final idea

grep -Pzo '(?s)\[Desktop\s+Entry\].*?\nName=[^\n]*' ${FP} | sed -rn '$ s/^Name=(.*)/\1/p' | tr '\0' '\n'

Why astronauts use Linux
Because you can't open windows in space

User avatar
AntonioPt
Posts: 219
Joined: Wed Aug 11, 2021 7:41 pm
Has thanked: 99 times
Been thanked: 37 times

Re: grep using a variable

Post by AntonioPt »

hi @HerrBert tell me some if you can

so now my gold is to grab from [Desktop Entry] till Name and then add new Name with new Language
Ex
[Desktop Entry]
Version=1.0
Type=Application
Name=Sublime Text
Name[pt]=Sublime Text

im using this sed but aint working since gonna add in all names

Code: Select all

sed -i "/^Name=.*/s/$/\nName\[${USER_LANG}\]=$(gettext "${UNIV_DATA}")/" ${FP}

and sublime text has more then one Name in it
gonna share sublime_txt desktop file

[Desktop Entry]
Version=1.0
Type=Application
Name=Sublime Text
Name[pt]=Sublime Text
GenericName=Text Editor
Comment=Sophisticated text editor for code, markup and prose
Exec=subl
Terminal=false
MimeType=text/plain;
Icon=sublime-text.png
Categories=TextEditor
StartupNotify=true
Actions=Window;Document;

[Desktop Action Document]
Name=New File
Name[pt]=Sublime Text
Exec=subl
OnlyShowIn=Unity;

[Desktop Action Window]
Name=New Window
Name[pt]=Sublime Text
Exec=subl
OnlyShowIn=Unity;

Why astronauts use Linux
Because you can't open windows in space

Burunduk
Posts: 256
Joined: Thu Jun 16, 2022 6:16 pm
Has thanked: 7 times
Been thanked: 127 times

Re: grep using a variable

Post by Burunduk »

AntonioPt wrote: Sun Nov 17, 2024 10:03 pm

im using this sed but aint working since gonna add in all names

You can limit the range of lines where sed will search for a "Name=":

Code: Select all

sed -i -e '/^\[.*Entry/,/^\[/{/^Name=/a\' -e "the line you want to add" -e '}' sample.desktop
User avatar
AntonioPt
Posts: 219
Joined: Wed Aug 11, 2021 7:41 pm
Has thanked: 99 times
Been thanked: 37 times

Re: grep using a variable

Post by AntonioPt »

Burunduk wrote: Mon Nov 18, 2024 12:23 pm
AntonioPt wrote: Sun Nov 17, 2024 10:03 pm

im using this sed but aint working since gonna add in all names

You can limit the range of lines where sed will search for a "Name=":

Code: Select all

sed -i -e '/^\[.*Entry/,/^\[/{/^Name=/a\' -e "the line you want to add" -e '}' sample.desktop

my solution

Code: Select all

 sed -i "/\[Desktop Entry\]/s/$/\nName\[${USER_LANG}\]=$(gettext "${UNIV_DATA}")/" ${FP} 

i all ready got a solution the only issue for me its that will not be organized beside that works like i want as well but gonna test your way
Thank you gonna test it :)

Why astronauts use Linux
Because you can't open windows in space

User avatar
AntonioPt
Posts: 219
Joined: Wed Aug 11, 2021 7:41 pm
Has thanked: 99 times
Been thanked: 37 times

Re: grep using a variable

Post by AntonioPt »

Hello @Burunduk ,
Works 100% like i wanna it thankyou so much now i can move on :)

Why astronauts use Linux
Because you can't open windows in space

User avatar
MochiMoppel
Posts: 1239
Joined: Mon Jun 15, 2020 6:25 am
Location: Japan
Has thanked: 21 times
Been thanked: 440 times

Re: grep using a variable

Post by MochiMoppel »

Burunduk wrote: Mon Nov 18, 2024 12:23 pm

You can limit the range of lines where sed will search for a "Name=":

Code: Select all

sed -i -e '/^\[.*Entry/,/^\[/{/^Name=/a\' -e "the line you want to add" -e '}' sample.desktop

:thumbup2: I struggled and failed to make the a (append text lines) command work within an address range. It apparently works since you used the -e option which I never use because so far I've never seen a reason to use it. Maybe I should make friends with this option? :lol:

My solution avoids -e and as far as I can see achieves the same result with somewhat simpler code:

Code: Select all

sed -i "
/Entry\]$/,/\]$/     s/^Name=.*/&\nName[ja]=texto A/
/Document\]$/,/\]$/  s/^Name=.*/&\nName[ja]=texto B/
/Window\]$/,/\]$/    s/^Name=.*/&\nName[ja]=texto C/
" sample.desktop
User avatar
AntonioPt
Posts: 219
Joined: Wed Aug 11, 2021 7:41 pm
Has thanked: 99 times
Been thanked: 37 times

Re: grep using a variable

Post by AntonioPt »

MochiMoppel wrote: Mon Nov 18, 2024 2:19 pm
Burunduk wrote: Mon Nov 18, 2024 12:23 pm

You can limit the range of lines where sed will search for a "Name=":

Code: Select all

sed -i -e '/^\[.*Entry/,/^\[/{/^Name=/a\' -e "the line you want to add" -e '}' sample.desktop

:thumbup2: I struggled and failed to make the a (append text lines) command work within an address range. It apparently works since you used the -e option which I never use because so far I've never seen a reason to use it. Maybe I should make friends with this option? :lol:

My solution avoids -e and as far as I can see achieves the same result with somewhat simpler code:

Code: Select all

sed -i "
/Entry\]$/,/\]$/     s/^Name=.*/&\nName[ja]=texto A/
/Document\]$/,/\]$/  s/^Name=.*/&\nName[ja]=texto B/
/Window\]$/,/\]$/    s/^Name=.*/&\nName[ja]=texto C/
" sample.desktop

Hi @MochiMoppel thxx for your tips but @Burunduk tip is better because the way im doing its to check one by one so that later i can translate desktop without replacing full file like Lang Packs do i all ready have a sample script that works needs to be improve now with a gui or via terminal :D
Let me share it :)
Just keep it in mind beta and more to do :D
To Collect all Names from Desktop and add translation if have all so and make a po file
http://patinsemlinhaslalom.altervista.o ... lect_all_2
To update desktop files in this demo will be Portuguese and the desktop files are in apps folder so that i don't screw up Original files :D just add mo file to pt folder and test it :D
http://patinsemlinhaslalom.altervista.o ... esk_update

Why astronauts use Linux
Because you can't open windows in space

User avatar
AntonioPt
Posts: 219
Joined: Wed Aug 11, 2021 7:41 pm
Has thanked: 99 times
Been thanked: 37 times

Re: grep using a variable (Solved)

Post by AntonioPt »

Need a Small help @Burunduk , @MochiMoppel and @HerrBert :D

add ENTRY and NAME as vars since i wanna do all in a dynamic way but sed ... i even change ' to " but no results

sed: -e expression #2, char 72: extra characters after command
sed: -e expression #2, char 79: extra characters after command
sed: -e expression #2, char 75: extra characters after command
sed: -e expression #2, char 84: extra characters after command

sed -i -e '/^\[${ENTRY}/,/^\[/{/^${NAME}=/a\' -e "${NAME}\[${USER_LANG}\]=$(gettext "${UNIV_DATA}")" -e '}' ${FP}

Why astronauts use Linux
Because you can't open windows in space

User avatar
Flash
Moderator
Posts: 978
Joined: Tue Dec 03, 2019 3:13 pm
Location: Arizona, U.S.
Has thanked: 51 times
Been thanked: 127 times

Re: grep using a variable (Solved)

Post by Flash »

Antonio, if the subject of your last post is different from the rest of this thread, please start a new thread with your post instead of confusing things by adding it to this one. Thanks.

Chaos coordinator :?
Burunduk
Posts: 256
Joined: Thu Jun 16, 2022 6:16 pm
Has thanked: 7 times
Been thanked: 127 times

Re: grep using a variable (Solved)

Post by Burunduk »

AntonioPt wrote: Wed Nov 20, 2024 12:19 am

... i even change ' to " but no results

You've got an error - this is a result too.

' and " are quite different in bash.

'$var' is just a literal string, no expansion happens;

'a\' is OK but "a\" is wrong - the backslash escapes the quote, it should be "a\\";

Do you expect me to guess what your variables may contain? It should be only one line after the a\ command - no newline characters (or they should be escaped). If for some reason gettext returns more than one line, this may result in the "extra characters after command" error.

Maybe turn on the tracing mode (set -x) to see what you get after the expansions.

The -e option is here only to keep the whole thing on the same line. It works also without -e:

Code: Select all

ENTRY="Desktop Entry"
NAME=Name
USER_LANG=en
SINGLE_LINE="text editor"
sed -i "/^\[$ENTRY/,/^\[/{/^$NAME=/a\
${NAME}\[${USER_LANG}\]=$SINGLE_LINE
}" sample.desktop

but it's an "extra chars" error when SINGLE_LINE=$'text editor\nname'.

It's also possible to modify the MochiMoppel's code, just keep one of the three s commands and add your variables.

---

@MochiMoppel It's possible to eliminate "e" (if you really hate that letter) even from the sed's name, and it still works:

Code: Select all

sd '(?s)Entry\]\n.*?Name=.*?\n' '${0}Name[eo]=redaktilo\n' sample.desktop
some1
Posts: 86
Joined: Wed Aug 19, 2020 4:32 am
Has thanked: 18 times
Been thanked: 15 times

Re: grep using a variable (Solved)

Post by some1 »

Perhaps
sed using a variable
??
Might be about the importance of flyspecs.

User avatar
MochiMoppel
Posts: 1239
Joined: Mon Jun 15, 2020 6:25 am
Location: Japan
Has thanked: 21 times
Been thanked: 440 times

Re: grep using a variable (Solved)

Post by MochiMoppel »

@AntonioPt The code you posted doesn't produce errors with my test data but it doesn't work either. Among other changes you eliminated the .* from Burunduk's code, which would allow your ENTRY variable to contain only a portion of the section name (e.g. 'Action Document' instead of 'Desktop Action Document' ).

This should work:
sed -e "/\[.*${ENTRY}/,/^\[/{/^${NAME}=/a\\" -e "${NAME}\[${USER_LANG}\]=$(gettext "${UNIV_DATA}")" -e '}' ${FP}

I know you don't like it, but my code also works
sed "/\[.*$ENTRY/,/^\[/ s/^$NAME=.*/&\n$NAME[$USER_LANG]=$(gettext "$UNIV_DATA")/" $FP

Tested with
ENTRY='Action Document'
NAME=Name
USER_LANG=ja
UNIV_DATA='some new text'

Add the -i option only after you are certain that the code produces the results you expect

User avatar
AntonioPt
Posts: 219
Joined: Wed Aug 11, 2021 7:41 pm
Has thanked: 99 times
Been thanked: 37 times

Re: grep using a variable (Solved)

Post by AntonioPt »

Thankyou all gonna try it and see the results
@Burunduk my idea was to avoid to write some code over and over so i did two list one of Desktop Entrys and another list of Names to grab and then 2 loops then your sed, but i allready notice that in BASH since are completed different from other languages and its a fresh new lang for me so sorry for any stupid question,... :D and thankyou for your explanations,..

@MochiMoppel yeah i all so notice my grep to match Desktop Entry till Name aint working has it should if Name[whatever] doesn't exist so he goes and grab the next Name[whatever] :D its not that i don't like your code its when i run for the first time Burunduk code work the way i wanna that's all :D

Guys im learning bash so if you guys notice that i'm asking a stupid question be patience since i don't mean nutting wrong ok ? and thankyou for your comprehension

@Flash since the issue add to with additional code this is why i comment here but thankyou for let me know anyway

Why astronauts use Linux
Because you can't open windows in space

User avatar
Flash
Moderator
Posts: 978
Joined: Tue Dec 03, 2019 3:13 pm
Location: Arizona, U.S.
Has thanked: 51 times
Been thanked: 127 times

Re: grep using a variable (Solved)

Post by Flash »

Okay, thanks.

Chaos coordinator :?
Post Reply

Return to “Scripts”