簡體   English   中英

一個sed diff結果:sed:-e表達式#1,字符4:無終止的s命令

[英]one sed diff result:sed: -e expression #1, char 4: unterminated `s' command

這里是r 2文件

--------------檔案--------------

1,2,3
2,xx,yy
3,lllll,ddd

------------文件b ---------------

8,55
9,555
100,5555

我想要的結果是:文件a -------------

8,2,3
9,xx,yy
100,lllll,ddd

所以bash是:

#!/bin/bash
for i in $(seq 3)
do
q=`awk -v aa=$i -F , 'NR==aa{print $1}' a`
qq=`awk -v aa=$i -F , 'NR==aa{print $1}' b`
sed -i "s/^$q/$qq/g" a 
done

這里沒有錯誤

但如果出現錯誤:

#! /bin/bash
for i in $(seq 3)
do
q=`awk 'BEGIN {FS=","} NF!=1{print $1}' a`
qq=`awk 'BEGIN {FS=","} NF!=1{print $1}' b`
sed -i "s/^$q/$qq/g" a
done

這是錯誤

sed:-e表達式#1,字符4:無終止的s命令

該錯誤如何發生?


當awk執行時,THX到@EdMorton q有3行,因此sed發生錯誤。 q應該拆分執行sed,所以

#! /bin/bash
q=`awk 'BEGIN {FS=","} {print $1}' a`
qq=`awk 'BEGIN {FS=","} {print $1}' b`
for ((i=1;i<=3;++i))
do
    a=`echo $q | cut -d" " -f $i`
    aa=`echo $qq | cut -d" " -f $i`
    sed -i "s/^$a/$aa/g" a
    echo $a
done

因此錯誤消失我在這里使用cut將q分成3個字段但是它的冗余和THX到@ user000001,答案很清楚**但是如果每個文件的字段和行都不同,則粘貼不適合

#! /bin/bash
so i vi a bash:
len1=`awk -v x=1 -F, '{if(NR>x){x=NR}}END{print x}' a`
len2=`awk -v x=1 -F, '{if(NR>x){x=NR}}END{print x}' b`
if ((len1>len2))
then
        ((yy=2*len2))

else
        ((yy=len1+len2))
fi
q=`awk -v begin="$len2" -v end="$yy"  'BEGIN{FS=OFS=",";ORS="\n";}{if(NR<=end-begin)  {arr[FNR]=$1;next}else if(NR>begin&&NR<=end){$1=arrFNR];print $0}}' b a`
echo $q

BTW,如果上述bash的結果:8,2,3,7,4 9,xx,yy 100,lllll,ddd 1000,aloha,ee沒有“\\ n”為什么?


@EdMorton大約2個以上的文件(或者我不知道我有多少個文件):

----文件-------------文件b -----------文件c ---------

1,2,3,4,7 -------------- 8,55 ------------- 99.3 $

2,XX,YYD --------------- ----------- 9,5555 999,43

3,LLLLL,DDD ------------ 100,5555 --------- 9999,533

4,阿羅哈,EE ---------- 1000,77

----------------------- 10000,567

** * * *我想要的結果是:

----文件---------------文件b -----------文件c ---------

8,2,3,4,7 -------------- 99,55 ------------- 99.3 $

9,XX,YYD --------------- 999,5555 ---------- 999,43

100,LLLLL,DDD ---------- --------- 9999,5555 9999,533

1000,阿羅哈,EE -------- 1000,77

----------------------- 10000,567

waht是最短的bash / awk / ...命令?

只需使用awk:

$ awk 'BEGIN{FS=OFS=","} NR==FNR{a[NR]=$1;next} {$1=a[FNR]} 1' b a
8,2,3
9,xx,yy
100,lllll,ddd

當使用帶雙引號的sed時,您會引起鼻惡魔,因為腳本中的shell變量在sed執行之前就已展開,因此存儲在這些變量中的所有字符都將成為腳本的一部分。 如果正確使用Awk,則不會出現此問題。 第二個腳本中使用的awk命令產生多行輸出,因此sed可以看到換行符和扼流圈。

可以使用cut and paste代替awk。 例如:

$ paste -d, <(cut -d, -f 1 fileb) <(cut -d, -f 2- filea) 
8,2,3
9,xx,yy
100,lllll,ddd

給出您想要的結果。

只需調用awk達到目的:

$ awk 'NR==FNR{a[NR]=$2FS$3;next}{print $1,a[FNR]}' FS=, OFS=, file1 file2
8,2,3
9,xx,yy
100,lllll,ddd

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM