이 문자열이 있습니다
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로 확장).$^@
list
22$^@22
3$^@33
e
$^@
$@
rc
fish
a=(1 2 3)
before${^a}after
before1after
before2after
before3after
before1
2
3after
before${a}after