пошук радкі ў файлах, калі ён адпавядае замяніць іншую радок у адным радку з некаторай радком

h -t 9.641909323 -s 0 -d 29 -p cbr -e 1078 -c 2 -a 0 -i 169 -k MAC
r -t 9.650534114 -s 29 -d 29 -p cbr -e 1020 -c 2 -a 0 -i 169 -k MAC
+ -t 9.650544114 -s 29 -d -1 -p ACK -e 38 -c 2 -a 0 -i 0 -k MAC 
- -t 9.650544114 -s 29 -d -1 -p ACK -e 38 -c 2 -a 0 -i 0 -k MAC
h -t 9.650544114 -s 29 -d -1 -p ACK -e 38 -c 2 -a 0 -i 0 -k MAC

here i need to search -s 0 -d 29 -p cbr if its match with any line on that line replace initial h with d

2

7 адказы

З Tcl, вы б напісаць некалькі даўжэй, чым праграмы ў гэтых іншых мовах:

# Open the files for streaming...
set filename "whatever.log"
set fin [open $filename]
set fout [file tempfile tempName]

# Process the lines, one by one...
while {[gets $fin line] >= 0} {   ### <<< THIS IS IDIOMATIC FOR STREAMING
    if {[string first "-s 0 -d 29 -p cbr" $line]} {
        regsub "^h" $line "d" line
    }
    puts $fout $line
}

# Finalize everything
close $fin
close $fout
file rename $tempName $filename

Калі вы хочаце, каб выхад ісці ў іншы файл, вы можаце проста выкарыстоўваць:

set fout [open "differentFile.txt" "w"]

замест ўсталяваць FOUT [файл часовых файлаў tempName] і апусціць перайменавання файлаў . (Гэта таксама дасць магчымасць зрабіць код працаваць на ўсіх версіях Tcl раней, чым 8.6; Файл часовы файл гэта новая функцыя, але ўсё астатняе выкарыстоўваецца тут была вакол на працягу стагоддзяў.)


У якасці альтэрнатывы, для версіі, якая счытвае ва ўсіх радках адразу, замяніць цэнтральную пятлю апрацоўкі з гэтым однострочником, які выкарыстоўвае замену лінейнага рэжыму RE і трохі спрыту:

# Use [puts -nonewline] because the last newline is kept with [read]
puts -nonewline $fout [regsub -all -line "^h(.*-s 0 -d 29 -p cbr)" [read $fin] "d\\1"]

Гэта, аднак, трымаць усе дадзеныя ў памяці адразу.

4
дададзена
Дарэчы, для 10К ліній з тымі відамі даўжыні лініі, я б усё гэта ў памяці. Гэта менш, чым МБ дадзеных, і мы ўсе атрымалі кампутары з некалькімі ГБ фізічнай памяці ...
дададзена аўтар Donal Fellows, крыніца

Калі радок адпавядае шаблоне, і першае поле ч ўсталяваць першае поле ў д :

$ awk '/-s 0 -d 29 -p cbr/&&$1=="h"{$1="d"}1' file
d -t 9.641909323 -s 0 -d 29 -p cbr -e 1078 -c 2 -a 0 -i 169 -k MAC
r -t 9.650534114 -s 29 -d 29 -p cbr -e 1020 -c 2 -a 0 -i 169 -k MAC
+ -t 9.650544114 -s 29 -d -1 -p ACK -e 38 -c 2 -a 0 -i 0 -k MAC
- -t 9.650544114 -s 29 -d -1 -p ACK -e 38 -c 2 -a 0 -i 0 -k MAC
h -t 9.650544114 -s 29 -d -1 -p ACK -e 38 -c 2 -a 0 -i 0 -k MAC

<�Моцны> Edit:

Толькі замяніць першы матч:

$ awk '/-s 0 -d 29 -p cbr/&&$1=="h"&&!f{$1="d";f=1}1' file
d -t 9.641909323 -s 0 -d 29 -p cbr -e 1078 -c 2 -a 0 -i 169 -k MAC
r -t 9.650534114 -s 29 -d 29 -p cbr -e 1020 -c 2 -a 0 -i 169 -k MAC
+ -t 9.650544114 -s 29 -d -1 -p ACK -e 38 -c 2 -a 0 -i 0 -k MAC
- -t 9.650544114 -s 29 -d -1 -p ACK -e 38 -c 2 -a 0 -i 0 -k MAC
h -t 9.650544114 -s 29 -d -1 -p ACK -e 38 -c 2 -a 0 -i 0 -k MAC
3
дададзена
Можа быць, вы павінны ўжо казалі пра гэта ў пытанні!? Глядзіце новы сцэнар змяніць толькі першае ўваходжанне.
дададзена аўтар Chris Seymour, крыніца
але яго не замяніць усе лініі яго замяніць толькі першы радок мой файл змяшчае каля 10000 радкоў
дададзена аўтар Naveen.S, крыніца

паспрабуйце ніжэй SED однострочника:

sed '/-s 0 -d 29 -p cbr/s/^h/d/' file
2
дададзена
Выбачайце за нуб пытанне, але: Якім чынам ваш код лінія мае колеру і не мая? (Тая ж лінія ...)
дададзена аўтар xShirase, крыніца
здаецца, што код падсвятляюцца пры выкарыстанні 4space водступаў, але не тады, калі вы карыстаецеся зваротныя двукоссі. Далейшае даследаванне паказвае, што не будзе вылучыць закавыченные коды, нават калі водступ. дзякуй ^^
дададзена аўтар xShirase, крыніца
@xShirase Паколькі вы згадалі ў адказ, вы не ўпэўненыя, калі ён будзе працаваць. : D жартую. Я не ведаю, як гэта SO зрабіць падсвятленне кода. але розніца ў тым, у мяне ёсць іншая частка пасля цытуемага сегмента, які з'яўляецца уваходным файлам. вашая не робіць. Гэта можа быць умовай для SO, каб вылучыць сінтаксіс?
дададзена аўтар Kent, крыніца
О, я не заўважыў наогул. добра ведаць. Я пішу/рэдагаваць свой пост у Vim, Вім робіць водступы для мяне. Я проста націснуў Tab
дададзена аўтар Kent, крыніца

Хуткі адказ, я не магу праверыць тут, нешта накшталт:

sed '/-s 0 -d 29 -p cbr/s/^h/d/' 

павінен працаваць. Дайце мне ведаць, ці рэдагаваць. Я буду ў стане праверыць толькі пазней. Поспехаў!

0
дададзена
Так, вы маеце рацыю, адрэдагаваныя!
дададзена аўтар xShirase, крыніца
Але, гэты выраз будзе замяніць ч з ^ г .
дададзена аўтар sat, крыніца

Да пачатковая ч , вы, здаецца, ставяцца да першага знаку ў адпаведны радок. Да гэтага здагадцы, павінна працаваць:

grep -- "-s 0 -d 29 -p cbr" inputfile | sed 's/^h/d/'
0
дададзена
Гэта не павінна было змяніць ўваходных файл. Гэта было? Паспрабуйце нешта накшталт: ф входной_файл tmpfile && Grep - "-s 0 -d 29 -p CBR" tmpfile | СЕПГ 's/^ г/г /'> входной_файл
дададзена аўтар devnull, крыніца
дзякуючы яго замяніць правільна і адлюстроўваецца, але мой входной_файл не змянілася.
дададзена аўтар Naveen.S, крыніца

Гэта можа працаваць для вас (GNU СЭД):

sed -r 's/^h(.*-s 0 -d 29 -p cbr)/d\1/' file
0
дададзена

Вы можаце паспрабаваць з гэтым,

sed  '/-s 0 -d 29 -p cbr/{s/^h\(.*\)/d\1/g}' file
0
дададзена