Replace group of similar text in string from nth position with one string else increment the value by +1 The 2019 Stack Overflow Developer Survey Results Are Inintroduce line break at the same position based on another fileextract certain string, search and replace or keep a longer string contain the extracted valueHow can I delete everything between two markers in a file?UNIX command for replacing within delimiter based on position of the delimiterHow to extract XML data from logs using Unix shell script?Extract part of the logs to other filelog processing/entry deletion, multi-pipe (grep sed grep), log traversed twice. can this solution be improved?sed or awk for formattingText file: find string, save string field to var, find 2nd string, replace field with var, repeat to endReplace text in lines in a file with increments
What tool would a Roman-age civilization have for the breaking of silver and other metals into dust?
Did Scotland spend $250,000 for the slogan "Welcome to Scotland"?
How to manage monthly salary
Pokemon Turn Based battle (Python)
Can you compress metal and what would be the consequences?
Loose spokes after only a few rides
Right tool to dig six foot holes?
Earliest use of the term "Galois extension"?
Why do we hear so much about the Trump administration deciding to impose and then remove tariffs?
Do these rules for Critical Successes and Critical Failures seem Fair?
Is there a symbol for a right arrow with a square in the middle?
Does a dangling wire really electrocute me if I'm standing in water?
Aging parents with no investments
Apparent duplicates between Haynes service instructions and MOT
Where to refill my bottle in India?
Lightning Grid - Columns and Rows?
Falsification in Math vs Science
Who coined the term "madman theory"?
Which Sci-Fi work first showed weapon of galactic-scale mass destruction?
Is "plugging out" electronic devices an American expression?
Delete all lines which don't have n characters before delimiter
Are there any other methods to apply to solving simultaneous equations?
What is the closest word meaning "respect for time / mindful"
Did Section 31 appear in Star Trek: The Next Generation?
Replace group of similar text in string from nth position with one string else increment the value by +1
The 2019 Stack Overflow Developer Survey Results Are Inintroduce line break at the same position based on another fileextract certain string, search and replace or keep a longer string contain the extracted valueHow can I delete everything between two markers in a file?UNIX command for replacing within delimiter based on position of the delimiterHow to extract XML data from logs using Unix shell script?Extract part of the logs to other filelog processing/entry deletion, multi-pipe (grep sed grep), log traversed twice. can this solution be improved?sed or awk for formattingText file: find string, save string field to var, find 2nd string, replace field with var, repeat to endReplace text in lines in a file with increments
.everyoneloves__top-leaderboard:empty,.everyoneloves__mid-leaderboard:empty,.everyoneloves__bot-mid-leaderboard:empty margin-bottom:0;
I have a text file with following lines for example.
Input
DD0TRANSID000019021210504250003379433005533665506656000008587201902070168304000.0AK 0000L00000.00 N 01683016832019021220190212N0000.001683065570067.000000.00000.0000000000000NAcknowledgment
DD0TRANSID000019021210504250003379433005535567606656000008587201902085381804000.0FC 0000L00000.00 N 53818538182019021220190212N0000.053818065570067.000000.00000.0000000000000NFirst Contact
DD0TRANSID000019021210510360003379433005535568006656000008587201902085381804000.0SR 0000L00000.00 N 53818538182019021220190212N0000.0
CC0TRANSID000019021210510360003379433005535568006656000008587201902085381804000.0SR 0000L00000.00 N 53818538182019021220190212N0000.0
My requirement is
If the line begins with "D" then replace string starting from 14th position to 27th Position with D00000X (X being a number with left padding)
If I come across the same value of string between 14th and 27th Position, that I encountered before in the file, I should replace with D00000X, else with D00000X+1
Output
DD0TRANSID00001902121D000006003379433005533665506656000008587201902070168304000.0AK 0000L00000.00 N 01683016832019021220190212N0000.001683065570067.000000.00000.0000000000000NAcknowledgment
DD0TRANSID00001902121D000006003379433005535567606656000008587201902085381804000.0FC 0000L00000.00 N 53818538182019021220190212N0000.053818065570067.000000.00000.0000000000000NFirst Contact
DD0TRANSID00001902121D000007003379433005535568006656000008587201902085381804000.0SR 0000L00000.00 N 53818538182019021220190212N0000.0
CC0TRANSID000019021210510360003379433005535568006656000008587201902085381804000.0SR 0000L00000.00 N 53818538182019021220190212N0000.0
awk sed perl
New contributor
add a comment |
I have a text file with following lines for example.
Input
DD0TRANSID000019021210504250003379433005533665506656000008587201902070168304000.0AK 0000L00000.00 N 01683016832019021220190212N0000.001683065570067.000000.00000.0000000000000NAcknowledgment
DD0TRANSID000019021210504250003379433005535567606656000008587201902085381804000.0FC 0000L00000.00 N 53818538182019021220190212N0000.053818065570067.000000.00000.0000000000000NFirst Contact
DD0TRANSID000019021210510360003379433005535568006656000008587201902085381804000.0SR 0000L00000.00 N 53818538182019021220190212N0000.0
CC0TRANSID000019021210510360003379433005535568006656000008587201902085381804000.0SR 0000L00000.00 N 53818538182019021220190212N0000.0
My requirement is
If the line begins with "D" then replace string starting from 14th position to 27th Position with D00000X (X being a number with left padding)
If I come across the same value of string between 14th and 27th Position, that I encountered before in the file, I should replace with D00000X, else with D00000X+1
Output
DD0TRANSID00001902121D000006003379433005533665506656000008587201902070168304000.0AK 0000L00000.00 N 01683016832019021220190212N0000.001683065570067.000000.00000.0000000000000NAcknowledgment
DD0TRANSID00001902121D000006003379433005535567606656000008587201902085381804000.0FC 0000L00000.00 N 53818538182019021220190212N0000.053818065570067.000000.00000.0000000000000NFirst Contact
DD0TRANSID00001902121D000007003379433005535568006656000008587201902085381804000.0SR 0000L00000.00 N 53818538182019021220190212N0000.0
CC0TRANSID000019021210510360003379433005535568006656000008587201902085381804000.0SR 0000L00000.00 N 53818538182019021220190212N0000.0
awk sed perl
New contributor
1
Are you sure the replacement happens at position 14? The output doesn't seem right - I see the change at position 21 (or 22 if 1-based).
– choroba
2 days ago
Is'nt it the same question
– ctac_
2 days ago
No, it isnt the same question. I need to repeat the replaced string, every time I encounter a duplicate string(string between 14-21 position) else keep incrementing.
– Rohit Prasad
2 days ago
add a comment |
I have a text file with following lines for example.
Input
DD0TRANSID000019021210504250003379433005533665506656000008587201902070168304000.0AK 0000L00000.00 N 01683016832019021220190212N0000.001683065570067.000000.00000.0000000000000NAcknowledgment
DD0TRANSID000019021210504250003379433005535567606656000008587201902085381804000.0FC 0000L00000.00 N 53818538182019021220190212N0000.053818065570067.000000.00000.0000000000000NFirst Contact
DD0TRANSID000019021210510360003379433005535568006656000008587201902085381804000.0SR 0000L00000.00 N 53818538182019021220190212N0000.0
CC0TRANSID000019021210510360003379433005535568006656000008587201902085381804000.0SR 0000L00000.00 N 53818538182019021220190212N0000.0
My requirement is
If the line begins with "D" then replace string starting from 14th position to 27th Position with D00000X (X being a number with left padding)
If I come across the same value of string between 14th and 27th Position, that I encountered before in the file, I should replace with D00000X, else with D00000X+1
Output
DD0TRANSID00001902121D000006003379433005533665506656000008587201902070168304000.0AK 0000L00000.00 N 01683016832019021220190212N0000.001683065570067.000000.00000.0000000000000NAcknowledgment
DD0TRANSID00001902121D000006003379433005535567606656000008587201902085381804000.0FC 0000L00000.00 N 53818538182019021220190212N0000.053818065570067.000000.00000.0000000000000NFirst Contact
DD0TRANSID00001902121D000007003379433005535568006656000008587201902085381804000.0SR 0000L00000.00 N 53818538182019021220190212N0000.0
CC0TRANSID000019021210510360003379433005535568006656000008587201902085381804000.0SR 0000L00000.00 N 53818538182019021220190212N0000.0
awk sed perl
New contributor
I have a text file with following lines for example.
Input
DD0TRANSID000019021210504250003379433005533665506656000008587201902070168304000.0AK 0000L00000.00 N 01683016832019021220190212N0000.001683065570067.000000.00000.0000000000000NAcknowledgment
DD0TRANSID000019021210504250003379433005535567606656000008587201902085381804000.0FC 0000L00000.00 N 53818538182019021220190212N0000.053818065570067.000000.00000.0000000000000NFirst Contact
DD0TRANSID000019021210510360003379433005535568006656000008587201902085381804000.0SR 0000L00000.00 N 53818538182019021220190212N0000.0
CC0TRANSID000019021210510360003379433005535568006656000008587201902085381804000.0SR 0000L00000.00 N 53818538182019021220190212N0000.0
My requirement is
If the line begins with "D" then replace string starting from 14th position to 27th Position with D00000X (X being a number with left padding)
If I come across the same value of string between 14th and 27th Position, that I encountered before in the file, I should replace with D00000X, else with D00000X+1
Output
DD0TRANSID00001902121D000006003379433005533665506656000008587201902070168304000.0AK 0000L00000.00 N 01683016832019021220190212N0000.001683065570067.000000.00000.0000000000000NAcknowledgment
DD0TRANSID00001902121D000006003379433005535567606656000008587201902085381804000.0FC 0000L00000.00 N 53818538182019021220190212N0000.053818065570067.000000.00000.0000000000000NFirst Contact
DD0TRANSID00001902121D000007003379433005535568006656000008587201902085381804000.0SR 0000L00000.00 N 53818538182019021220190212N0000.0
CC0TRANSID000019021210510360003379433005535568006656000008587201902085381804000.0SR 0000L00000.00 N 53818538182019021220190212N0000.0
awk sed perl
awk sed perl
New contributor
New contributor
edited 2 days ago
Rohit Prasad
New contributor
asked 2 days ago
Rohit PrasadRohit Prasad
11
11
New contributor
New contributor
1
Are you sure the replacement happens at position 14? The output doesn't seem right - I see the change at position 21 (or 22 if 1-based).
– choroba
2 days ago
Is'nt it the same question
– ctac_
2 days ago
No, it isnt the same question. I need to repeat the replaced string, every time I encounter a duplicate string(string between 14-21 position) else keep incrementing.
– Rohit Prasad
2 days ago
add a comment |
1
Are you sure the replacement happens at position 14? The output doesn't seem right - I see the change at position 21 (or 22 if 1-based).
– choroba
2 days ago
Is'nt it the same question
– ctac_
2 days ago
No, it isnt the same question. I need to repeat the replaced string, every time I encounter a duplicate string(string between 14-21 position) else keep incrementing.
– Rohit Prasad
2 days ago
1
1
Are you sure the replacement happens at position 14? The output doesn't seem right - I see the change at position 21 (or 22 if 1-based).
– choroba
2 days ago
Are you sure the replacement happens at position 14? The output doesn't seem right - I see the change at position 21 (or 22 if 1-based).
– choroba
2 days ago
Is'nt it the same question
– ctac_
2 days ago
Is'nt it the same question
– ctac_
2 days ago
No, it isnt the same question. I need to repeat the replaced string, every time I encounter a duplicate string(string between 14-21 position) else keep incrementing.
– Rohit Prasad
2 days ago
No, it isnt the same question. I need to repeat the replaced string, every time I encounter a duplicate string(string between 14-21 position) else keep incrementing.
– Rohit Prasad
2 days ago
add a comment |
1 Answer
1
active
oldest
votes
Assuming that these are date/time stamps and increment in sequence then
a=($(grep -Po "(?<=^D.13).13" testfile | uniq))
for ((i=0; i<$#a[@]; i+=1)); do
s=$a[$i]
sed -E -i "s/(D.13)$s/1$s:0:7D$(printf '%06d' $((i+1)))/g" testfile
done
If a stamp repeats further down the file it gets a new counter increment. If you don't want that then the uniq
needs to be sort | uniq
which will apply the same counter to the same stamp throughout the file.
BTW, looks like you removed the 0 at position 28 in your example.
add a comment |
Your Answer
StackExchange.ready(function()
var channelOptions =
tags: "".split(" "),
id: "106"
;
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function()
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled)
StackExchange.using("snippets", function()
createEditor();
);
else
createEditor();
);
function createEditor()
StackExchange.prepareEditor(
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: false,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: null,
bindNavPrevention: true,
postfix: "",
imageUploader:
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
,
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
);
);
Rohit Prasad is a new contributor. Be nice, and check out our Code of Conduct.
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
Required, but never shown
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2funix.stackexchange.com%2fquestions%2f511241%2freplace-group-of-similar-text-in-string-from-nth-position-with-one-string-else-i%23new-answer', 'question_page');
);
Post as a guest
Required, but never shown
1 Answer
1
active
oldest
votes
1 Answer
1
active
oldest
votes
active
oldest
votes
active
oldest
votes
Assuming that these are date/time stamps and increment in sequence then
a=($(grep -Po "(?<=^D.13).13" testfile | uniq))
for ((i=0; i<$#a[@]; i+=1)); do
s=$a[$i]
sed -E -i "s/(D.13)$s/1$s:0:7D$(printf '%06d' $((i+1)))/g" testfile
done
If a stamp repeats further down the file it gets a new counter increment. If you don't want that then the uniq
needs to be sort | uniq
which will apply the same counter to the same stamp throughout the file.
BTW, looks like you removed the 0 at position 28 in your example.
add a comment |
Assuming that these are date/time stamps and increment in sequence then
a=($(grep -Po "(?<=^D.13).13" testfile | uniq))
for ((i=0; i<$#a[@]; i+=1)); do
s=$a[$i]
sed -E -i "s/(D.13)$s/1$s:0:7D$(printf '%06d' $((i+1)))/g" testfile
done
If a stamp repeats further down the file it gets a new counter increment. If you don't want that then the uniq
needs to be sort | uniq
which will apply the same counter to the same stamp throughout the file.
BTW, looks like you removed the 0 at position 28 in your example.
add a comment |
Assuming that these are date/time stamps and increment in sequence then
a=($(grep -Po "(?<=^D.13).13" testfile | uniq))
for ((i=0; i<$#a[@]; i+=1)); do
s=$a[$i]
sed -E -i "s/(D.13)$s/1$s:0:7D$(printf '%06d' $((i+1)))/g" testfile
done
If a stamp repeats further down the file it gets a new counter increment. If you don't want that then the uniq
needs to be sort | uniq
which will apply the same counter to the same stamp throughout the file.
BTW, looks like you removed the 0 at position 28 in your example.
Assuming that these are date/time stamps and increment in sequence then
a=($(grep -Po "(?<=^D.13).13" testfile | uniq))
for ((i=0; i<$#a[@]; i+=1)); do
s=$a[$i]
sed -E -i "s/(D.13)$s/1$s:0:7D$(printf '%06d' $((i+1)))/g" testfile
done
If a stamp repeats further down the file it gets a new counter increment. If you don't want that then the uniq
needs to be sort | uniq
which will apply the same counter to the same stamp throughout the file.
BTW, looks like you removed the 0 at position 28 in your example.
answered 2 days ago
bu5hmanbu5hman
1,356415
1,356415
add a comment |
add a comment |
Rohit Prasad is a new contributor. Be nice, and check out our Code of Conduct.
Rohit Prasad is a new contributor. Be nice, and check out our Code of Conduct.
Rohit Prasad is a new contributor. Be nice, and check out our Code of Conduct.
Rohit Prasad is a new contributor. Be nice, and check out our Code of Conduct.
Thanks for contributing an answer to Unix & Linux Stack Exchange!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
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
Required, but never shown
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2funix.stackexchange.com%2fquestions%2f511241%2freplace-group-of-similar-text-in-string-from-nth-position-with-one-string-else-i%23new-answer', 'question_page');
);
Post as a guest
Required, but never shown
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
Required, but never shown
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
Required, but never shown
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
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
-awk, perl, sed
1
Are you sure the replacement happens at position 14? The output doesn't seem right - I see the change at position 21 (or 22 if 1-based).
– choroba
2 days ago
Is'nt it the same question
– ctac_
2 days ago
No, it isnt the same question. I need to repeat the replaced string, every time I encounter a duplicate string(string between 14-21 position) else keep incrementing.
– Rohit Prasad
2 days ago