Pipelined Sed does not work on found filename inside Bash command substitution when invoked from Find â-execâ

Clash Royale CLAN TAG#URR8PPP
up vote
3
down vote
favorite
It looks like 'find', 'bash' and 'sed' in some cases does not work as one expects.
The following example should first create file 'sample.txt', then find the file and finally process it by '-exec' command. The executed command prints found filename, test specimens, and modified filename. The 'sed' command itself is used to replace 'txt' to 'TXT'.
touch sample.txt
find ./ -maxdepth 1 -name "*.txt" -exec echo $(echo Specimen_before.txt Specimen_after.txt |sed -e "s/txt/TXT/g") ;
The expected output is:
./sample.txt Specimen_before.TXT ./sample.TXT Specimen_after.TXT
Instead it produces:
./sample.txt Specimen_before.TXT ./sample.txt Specimen_after.TXT
(the example has been tested also with old-school command substitution through backquotes '`' with the same result)
What am I doing wrong?
bash sed pipe command-substitution
add a comment |Â
up vote
3
down vote
favorite
It looks like 'find', 'bash' and 'sed' in some cases does not work as one expects.
The following example should first create file 'sample.txt', then find the file and finally process it by '-exec' command. The executed command prints found filename, test specimens, and modified filename. The 'sed' command itself is used to replace 'txt' to 'TXT'.
touch sample.txt
find ./ -maxdepth 1 -name "*.txt" -exec echo $(echo Specimen_before.txt Specimen_after.txt |sed -e "s/txt/TXT/g") ;
The expected output is:
./sample.txt Specimen_before.TXT ./sample.TXT Specimen_after.TXT
Instead it produces:
./sample.txt Specimen_before.TXT ./sample.txt Specimen_after.TXT
(the example has been tested also with old-school command substitution through backquotes '`' with the same result)
What am I doing wrong?
bash sed pipe command-substitution
Why do you expectsed -e "s/txt/TXT/g"to leave alone the secondtxt?is expanded beforesedgets to see it.
â Satà  Katsura
Oct 30 '17 at 10:58
Not sure I understand your question. I expect the "echo Specimen_before.txt Specimen_after.txt" gets printed by the echo, then it gets processed by the sed "|sed -e "s/txt/TXT/g"". I assume the expansion is done before the whole '-exec' command is invoked.
â Venca B Spam
Oct 30 '17 at 11:06
Ok, not I got it. Both Satà  Katsura and Kusalananda answers lead me to understand that the "command substitution is executed before find even starts".
â Venca B Spam
Oct 30 '17 at 11:14
I actually think @Satà ÂKatsura's comment is slightly wrong.is expanded byfind, aftersedhas seen it ("it" being the string).
â Kusalananda
Oct 30 '17 at 11:39
You are right, the sed is invoked before find due to the shell command substitution, which is done before the find is executed by the shell.
â Venca B Spam
Oct 30 '17 at 12:12
add a comment |Â
up vote
3
down vote
favorite
up vote
3
down vote
favorite
It looks like 'find', 'bash' and 'sed' in some cases does not work as one expects.
The following example should first create file 'sample.txt', then find the file and finally process it by '-exec' command. The executed command prints found filename, test specimens, and modified filename. The 'sed' command itself is used to replace 'txt' to 'TXT'.
touch sample.txt
find ./ -maxdepth 1 -name "*.txt" -exec echo $(echo Specimen_before.txt Specimen_after.txt |sed -e "s/txt/TXT/g") ;
The expected output is:
./sample.txt Specimen_before.TXT ./sample.TXT Specimen_after.TXT
Instead it produces:
./sample.txt Specimen_before.TXT ./sample.txt Specimen_after.TXT
(the example has been tested also with old-school command substitution through backquotes '`' with the same result)
What am I doing wrong?
bash sed pipe command-substitution
It looks like 'find', 'bash' and 'sed' in some cases does not work as one expects.
The following example should first create file 'sample.txt', then find the file and finally process it by '-exec' command. The executed command prints found filename, test specimens, and modified filename. The 'sed' command itself is used to replace 'txt' to 'TXT'.
touch sample.txt
find ./ -maxdepth 1 -name "*.txt" -exec echo $(echo Specimen_before.txt Specimen_after.txt |sed -e "s/txt/TXT/g") ;
The expected output is:
./sample.txt Specimen_before.TXT ./sample.TXT Specimen_after.TXT
Instead it produces:
./sample.txt Specimen_before.TXT ./sample.txt Specimen_after.TXT
(the example has been tested also with old-school command substitution through backquotes '`' with the same result)
What am I doing wrong?
bash sed pipe command-substitution
asked Oct 30 '17 at 10:52
Venca B Spam
182
182
Why do you expectsed -e "s/txt/TXT/g"to leave alone the secondtxt?is expanded beforesedgets to see it.
â Satà  Katsura
Oct 30 '17 at 10:58
Not sure I understand your question. I expect the "echo Specimen_before.txt Specimen_after.txt" gets printed by the echo, then it gets processed by the sed "|sed -e "s/txt/TXT/g"". I assume the expansion is done before the whole '-exec' command is invoked.
â Venca B Spam
Oct 30 '17 at 11:06
Ok, not I got it. Both Satà  Katsura and Kusalananda answers lead me to understand that the "command substitution is executed before find even starts".
â Venca B Spam
Oct 30 '17 at 11:14
I actually think @Satà ÂKatsura's comment is slightly wrong.is expanded byfind, aftersedhas seen it ("it" being the string).
â Kusalananda
Oct 30 '17 at 11:39
You are right, the sed is invoked before find due to the shell command substitution, which is done before the find is executed by the shell.
â Venca B Spam
Oct 30 '17 at 12:12
add a comment |Â
Why do you expectsed -e "s/txt/TXT/g"to leave alone the secondtxt?is expanded beforesedgets to see it.
â Satà  Katsura
Oct 30 '17 at 10:58
Not sure I understand your question. I expect the "echo Specimen_before.txt Specimen_after.txt" gets printed by the echo, then it gets processed by the sed "|sed -e "s/txt/TXT/g"". I assume the expansion is done before the whole '-exec' command is invoked.
â Venca B Spam
Oct 30 '17 at 11:06
Ok, not I got it. Both Satà  Katsura and Kusalananda answers lead me to understand that the "command substitution is executed before find even starts".
â Venca B Spam
Oct 30 '17 at 11:14
I actually think @Satà ÂKatsura's comment is slightly wrong.is expanded byfind, aftersedhas seen it ("it" being the string).
â Kusalananda
Oct 30 '17 at 11:39
You are right, the sed is invoked before find due to the shell command substitution, which is done before the find is executed by the shell.
â Venca B Spam
Oct 30 '17 at 12:12
Why do you expect
sed -e "s/txt/TXT/g" to leave alone the second txt? is expanded before sed gets to see it.â Satà  Katsura
Oct 30 '17 at 10:58
Why do you expect
sed -e "s/txt/TXT/g" to leave alone the second txt? is expanded before sed gets to see it.â Satà  Katsura
Oct 30 '17 at 10:58
Not sure I understand your question. I expect the "echo Specimen_before.txt Specimen_after.txt" gets printed by the echo, then it gets processed by the sed "|sed -e "s/txt/TXT/g"". I assume the expansion is done before the whole '-exec' command is invoked.
â Venca B Spam
Oct 30 '17 at 11:06
Not sure I understand your question. I expect the "echo Specimen_before.txt Specimen_after.txt" gets printed by the echo, then it gets processed by the sed "|sed -e "s/txt/TXT/g"". I assume the expansion is done before the whole '-exec' command is invoked.
â Venca B Spam
Oct 30 '17 at 11:06
Ok, not I got it. Both Satà  Katsura and Kusalananda answers lead me to understand that the "command substitution is executed before find even starts".
â Venca B Spam
Oct 30 '17 at 11:14
Ok, not I got it. Both Satà  Katsura and Kusalananda answers lead me to understand that the "command substitution is executed before find even starts".
â Venca B Spam
Oct 30 '17 at 11:14
I actually think @Satà ÂKatsura's comment is slightly wrong.
is expanded by find, after sed has seen it ("it" being the string ).â Kusalananda
Oct 30 '17 at 11:39
I actually think @Satà ÂKatsura's comment is slightly wrong.
is expanded by find, after sed has seen it ("it" being the string ).â Kusalananda
Oct 30 '17 at 11:39
You are right, the sed is invoked before find due to the shell command substitution, which is done before the find is executed by the shell.
â Venca B Spam
Oct 30 '17 at 12:12
You are right, the sed is invoked before find due to the shell command substitution, which is done before the find is executed by the shell.
â Venca B Spam
Oct 30 '17 at 12:12
add a comment |Â
1 Answer
1
active
oldest
votes
up vote
1
down vote
accepted
The command substitution is executed before find even starts. The actual command executed (after substitutions, expansions and quote removals etc.) is
find ./ -maxdepth 1 -name *.txt -exec echo Specimen_before.TXT Specimen_after.TXT ;
If you need to run anything fancy (pipes or multiple commands) with -exec, then start a separate shell to do it:
find . -maxdepth 1 -type f -name '*.txt'
-exec sh -c 'printf "%s " "$1"; printf "%s %s %sn" "before.txt" "$1" "after.txt" | sed "s/txt/TXT/g"' sh ';'
I got it. Your "The command substitution is executed before find even starts." is the answer.
â Venca B Spam
Oct 30 '17 at 11:12
add a comment |Â
1 Answer
1
active
oldest
votes
1 Answer
1
active
oldest
votes
active
oldest
votes
active
oldest
votes
up vote
1
down vote
accepted
The command substitution is executed before find even starts. The actual command executed (after substitutions, expansions and quote removals etc.) is
find ./ -maxdepth 1 -name *.txt -exec echo Specimen_before.TXT Specimen_after.TXT ;
If you need to run anything fancy (pipes or multiple commands) with -exec, then start a separate shell to do it:
find . -maxdepth 1 -type f -name '*.txt'
-exec sh -c 'printf "%s " "$1"; printf "%s %s %sn" "before.txt" "$1" "after.txt" | sed "s/txt/TXT/g"' sh ';'
I got it. Your "The command substitution is executed before find even starts." is the answer.
â Venca B Spam
Oct 30 '17 at 11:12
add a comment |Â
up vote
1
down vote
accepted
The command substitution is executed before find even starts. The actual command executed (after substitutions, expansions and quote removals etc.) is
find ./ -maxdepth 1 -name *.txt -exec echo Specimen_before.TXT Specimen_after.TXT ;
If you need to run anything fancy (pipes or multiple commands) with -exec, then start a separate shell to do it:
find . -maxdepth 1 -type f -name '*.txt'
-exec sh -c 'printf "%s " "$1"; printf "%s %s %sn" "before.txt" "$1" "after.txt" | sed "s/txt/TXT/g"' sh ';'
I got it. Your "The command substitution is executed before find even starts." is the answer.
â Venca B Spam
Oct 30 '17 at 11:12
add a comment |Â
up vote
1
down vote
accepted
up vote
1
down vote
accepted
The command substitution is executed before find even starts. The actual command executed (after substitutions, expansions and quote removals etc.) is
find ./ -maxdepth 1 -name *.txt -exec echo Specimen_before.TXT Specimen_after.TXT ;
If you need to run anything fancy (pipes or multiple commands) with -exec, then start a separate shell to do it:
find . -maxdepth 1 -type f -name '*.txt'
-exec sh -c 'printf "%s " "$1"; printf "%s %s %sn" "before.txt" "$1" "after.txt" | sed "s/txt/TXT/g"' sh ';'
The command substitution is executed before find even starts. The actual command executed (after substitutions, expansions and quote removals etc.) is
find ./ -maxdepth 1 -name *.txt -exec echo Specimen_before.TXT Specimen_after.TXT ;
If you need to run anything fancy (pipes or multiple commands) with -exec, then start a separate shell to do it:
find . -maxdepth 1 -type f -name '*.txt'
-exec sh -c 'printf "%s " "$1"; printf "%s %s %sn" "before.txt" "$1" "after.txt" | sed "s/txt/TXT/g"' sh ';'
answered Oct 30 '17 at 11:07
Kusalananda
105k14209326
105k14209326
I got it. Your "The command substitution is executed before find even starts." is the answer.
â Venca B Spam
Oct 30 '17 at 11:12
add a comment |Â
I got it. Your "The command substitution is executed before find even starts." is the answer.
â Venca B Spam
Oct 30 '17 at 11:12
I got it. Your "The command substitution is executed before find even starts." is the answer.
â Venca B Spam
Oct 30 '17 at 11:12
I got it. Your "The command substitution is executed before find even starts." is the answer.
â Venca B Spam
Oct 30 '17 at 11:12
add a comment |Â
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2funix.stackexchange.com%2fquestions%2f401384%2fpipelined-sed-does-not-work-on-found-filename-inside-bash-command-substitution-w%23new-answer', 'question_page');
);
Post as a guest
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Why do you expect
sed -e "s/txt/TXT/g"to leave alone the secondtxt?is expanded beforesedgets to see it.â Satà  Katsura
Oct 30 '17 at 10:58
Not sure I understand your question. I expect the "echo Specimen_before.txt Specimen_after.txt" gets printed by the echo, then it gets processed by the sed "|sed -e "s/txt/TXT/g"". I assume the expansion is done before the whole '-exec' command is invoked.
â Venca B Spam
Oct 30 '17 at 11:06
Ok, not I got it. Both Satà  Katsura and Kusalananda answers lead me to understand that the "command substitution is executed before find even starts".
â Venca B Spam
Oct 30 '17 at 11:14
I actually think @Satà ÂKatsura's comment is slightly wrong.
is expanded byfind, aftersedhas seen it ("it" being the string).â Kusalananda
Oct 30 '17 at 11:39
You are right, the sed is invoked before find due to the shell command substitution, which is done before the find is executed by the shell.
â Venca B Spam
Oct 30 '17 at 12:12