sed는 중간 문자열을 대체합니다.

sed는 중간 문자열을 대체합니다.

이 문자열이 있습니다

22<>22

이 목록이 있어요

test
dev
too

출력은 다음과 같아야합니다

22test22
22dev22
etc..

이 작업을 수행하는 데 사용하는 명령은 다음과 같습니다

cat list | sed 's/$/22/g' | sed 's/^/22/g'

편집하다

이 작업을 수행하는 데 사용하는 명령

cat list | sed 's/$/22/' | sed 's/^/22/'

하지만 목록이 너무 많아서 도움이 되지 않습니다.

22<>22
3<>33
134423<>4

답변1

대체할 문자열 목록을 배열에 할당할 수 있습니다 <>. 라는 파일에는 다음이 list.txt있어야 합니다.

test
dev
too

라는 파일에는 다음이 data.txt있어야 합니다.

22<>22
3<>33
134423<>4

해결 방법 1: 파일을 읽고 list.txt해당 내용을 배열에 할당합니다.

Bash를 사용하여 배열 읽기

export IFS=$'\n'
readarray array < list.txt

zsh를 사용하여 배열 읽기

array=("${(@f)"$(<list.txt)"}") 

마지막으로 변수를 반복하여 array목록의 각 요소를 가져오고 다음으로 바꿔야 합니다 sed.

for i in ${array[@]}; do 
sed "s/<>/$i/g" data.txt
done

노트:for 루프는 터미널의 표준 출력으로 텍스트를 인쇄합니다. 그러나 출력을 파일로 리디렉션하려면 >after done키워드를 사용할 수 있습니다.

for i in ${array[@]}; do 
sed "s/<>/$i/g" data.txt
done > final.txt

이 솔루션은 다음과 같은 출력을 생성합니다.

22test22
3test33
134423test4
22dev22
3dev33
134423dev4
22too22
3too33
134423too4

해결 방법 2: 먼저 파일을 읽고 list.txt그 내용을 배열에 할당해야 합니다. Bash를 사용하여 배열 읽기

export IFS=$'\n'
readarray array < list.txt

zsh를 사용하여 배열 읽기

array=("${(@f)"$(<list.txt)"}") 

그런 다음 파일의 각 줄을 반복해야 하며 data.txt해당 루프 내에서 배열의 각 항목을 읽어 sed명령을 적용해야 합니다.

while read line ; do 
for i in ${array[@]}; do 
   sed "s/<>/$i/g" <<< "$line"
done
done < data.txt

또는 표준 출력을 파일로 리디렉션합니다.

while read line ; do 
for i in ${array[@]}; do 
   sed "s/<>/$i/g" <<< "$line"
done
done < data.txt > final.txt

이 솔루션은 다음과 같은 출력을 생성합니다.

22test22
22dev22
22too22
3test33
3dev33
3too33
134423test4
134423dev4
134423too4

답변2

<>문자 구분 기호로 변경 |:

$ sed -s 's/<>/|/g' asdf1 > asdf2
$ cat asdf2
22|22
3|33
134423|4

동일한 단일 문자 구분 기호를 사용하여 |2개의 파일을 하나로 병합합니다 .

$ paste -d"|" asdf asdf2 > combined
$ cat combined
test|22|22
dev|3|33
too|134423|4

로 분할 |하고 순서대로 인쇄합니다.

$ awk -F'|' '{print $2 $1 $3}'  combined
22test22
3dev33
134423too4

요약하면 다음과 같습니다.

sed -s 's/<>/|/g' asdf1 > asdf2
paste -d"|" asdf asdf2 > combined
awk -F'|' '{print $3 $1 $2}'  combined

<>그러나 이는 각 줄에 자리 표시자가 1개만 있는 경우에만 작동합니다.

답변3

의 경우 , 또는 문자가 모두 포함되어 있지 않다고 zsh가정합니다 .list$`\

$ cat list
22<>22
3<>33
134423<>4
$ cat data
test
dev
too
$ () {print -rC1 -- ${(e)${(f)"$(<list)"}//'<>'/'$^@'}; } ${(f)"$(<data)"}
22test22
22dev22
22too22
3test33
3dev33
3too33
134423test4
134423dev4
134423too4

비어 있지 않은 줄을 data익명 함수에 매개변수로 전달합니다. 해당 함수에서 우리는 라인을 대체하여 <>xpand 인수 확장 플래그를 사용하여 (인수 목록)과 같은 확장을 수행합니다. 단, 배열은 csh- 대신 /-like로 확장됩니다. (with 대신 with로 확장).$^@list22$^@22 3$^@33e$^@$@rcfisha=(1 2 3)before${^a}afterbefore1after before2after before3afterbefore1 2 3afterbefore${a}after

관련 정보