Linux 如何将sed命令应用于所有文件的某些行?

Linux 如何将sed命令应用于所有文件的某些行?,linux,bash,sed,Linux,Bash,Sed,我有95个文件,看起来像: 2019-10-29-18-00/dev/xx;512.00;0.4;/var/x/xx/xxx 2019-10-29-18-00/dev/xx;512.00;0.68;/xx 2019-10-29-18-00/dev/xx;512.00;1.84;/xx/xx/xx 2019-10-29-18-00/dev/xx;512.00;80.08;/opt/xx/x 2019-10-29-18-00/dev/xx;20480.00;83.44;/var/x/x 2019-1

我有95个文件,看起来像:

2019-10-29-18-00/dev/xx;512.00;0.4;/var/x/xx/xxx
2019-10-29-18-00/dev/xx;512.00;0.68;/xx
2019-10-29-18-00/dev/xx;512.00;1.84;/xx/xx/xx
2019-10-29-18-00/dev/xx;512.00;80.08;/opt/xx/x
2019-10-29-18-00/dev/xx;20480.00;83.44;/var/x/x
2019-10-29-18-00/dev/xx;3584.00;840.43;/var/xx/x
2019-10-30-00-00/dev/xx;2048.00;411.59;/
2019-10-30-00-00/dev/xx;7168.00;6168.09;/usr
2019-10-30-00-00/dev/xx;3072.00;1036.1;/var
2019-10-30-00-00/dev/xx;5120.00;348.72;/tmp
2019-10-30-00-00/dev/xx;20480.00;2033.19;/home
2019-10-30-12-00;/dev/xx;5120.00;348.72;/tmp
2019-10-30-12-00;/dev/hd1;20480.00;2037.62;/home
2019-10-30-12-00;/dev/xx;512.00;0.43;/xx
2019-10-30-12-00;/dev/xx;3584.00;794.39;/xx
2019-10-30-12-00;/dev/xx;512.00;0.4;/var/xx/xx/xx
2019-10-30-12-00;/dev/xx;512.00;0.68;/xx
2019-10-30-12-00;/dev/xx;512.00;1.84;/var/xx/xx
2019-10-30-12-00;/dev/xx;512.00;80.08;/opt/xx/x
2019-10-30-12-00;/dev/xx;20480.00;83.44;/var/xx/xx
2019-10-30-12-00;/dev/x;3584.00;840.43;/var/xx/xx
对于一些线路,我已经
2019-10-29-18-00/dev
,对于其他线路,我已经
2019-10-30-12-00/dev/

我想添加
在缺少它的
/dev/
之前,因此我使用以下sed命令:

sed 's/\/dev/\;\/dev/'
但是如何将此命令应用于
中的每一行丢失了吗?我试试这个:

for i in $(cat /home/xxx/xxx/xxx/*.txt | grep -e "00/dev/")
do 
sed 's/\/dev/\;\/dev/' $i > $i
done

但它不起作用。。。你能帮我吗?

如果你同意的话,你能用GNU
awk试试下面的内容吗

awk -i inplace '/00\/dev\//{gsub(/00\/dev\//,"/00;/dev/")} 1'  *.txt
sed
解决方案:
使用GNU
sed
对少数文件进行了测试,效果良好

sed -i.bak  '/00\/dev/s/00\/dev/00\;\/dev/g' *.txt

如果您对GNU
awk
满意,请尝试以下内容

awk -i inplace '/00\/dev\//{gsub(/00\/dev\//,"/00;/dev/")} 1'  *.txt
sed
解决方案:
使用GNU
sed
对少数文件进行了测试,效果良好

sed -i.bak  '/00\/dev/s/00\/dev/00\;\/dev/g' *.txt

grep
用于过滤的功能可以消除在您的情况下,我们可以使用单个
sed
命令完成此任务:

for f in $(cat /home/xxx/xxx/xxx/*.txt)
do 
    [[ -f "$f" ]] && sed -Ei '/00\/dev/ s/([^;])(\/dev)/\1;\2/' "$f"
done

grep
用于过滤的功能可以消除在您的情况下,我们可以使用单个
sed
命令完成此任务:

for f in $(cat /home/xxx/xxx/xxx/*.txt)
do 
    [[ -f "$f" ]] && sed -Ei '/00\/dev/ s/([^;])(\/dev)/\1;\2/' "$f"
done

忽略带有
的行/开发人员

sed '/;\/dev/{p;d}; s^/dev^;/dev^'
/\/dev/
检查该行是否有
/开发人员
。如果有
/dev
do:
p
-打印当前行,并从开头开始

您可以在
sed
中的
s
命令中使用任何字符。而且,不需要转义
\,只是

如何将此命令应用于;她失踪了吗?我试试这个

不要编辑重定向到同一文件的同一文件
$i>$i
。想想看。如何在同一时间重新写入和读取同一文件?不能,在大多数情况下,生成的文件将是空的,因为
$i
将首先“执行”使文件为空,然后
sed$i
将开始运行并读取空文件。使用临时文件
sed。。。“$i”>temp.txt;mv temp.txt“$i”
或使用gnu扩展名
-i
sed
选项就地编辑

你真正想做的是:

grep -l '00/dev/' /home/xxx/xxx/xxx/*.txt |
xargs -n1 sed -i '/;\/dev/{p;d}; s^/dev^;/dev^'

grep-l
打印与模式匹配的文件列表,然后
xargs
为每个
-n1
文件执行
sed
,sed
-i
编辑文件。

忽略带有
的行/开发人员

sed '/;\/dev/{p;d}; s^/dev^;/dev^'
/\/dev/
检查该行是否有
/开发人员
。如果有
/dev
do:
p
-打印当前行,并从开头开始

您可以在
sed
中的
s
命令中使用任何字符。而且,不需要转义
\,只是

如何将此命令应用于;她失踪了吗?我试试这个

不要编辑重定向到同一文件的同一文件
$i>$i
。想想看。如何在同一时间重新写入和读取同一文件?不能,在大多数情况下,生成的文件将是空的,因为
$i
将首先“执行”使文件为空,然后
sed$i
将开始运行并读取空文件。使用临时文件
sed。。。“$i”>temp.txt;mv temp.txt“$i”
或使用gnu扩展名
-i
sed
选项就地编辑

你真正想做的是:

grep -l '00/dev/' /home/xxx/xxx/xxx/*.txt |
xargs -n1 sed -i '/;\/dev/{p;d}; s^/dev^;/dev^'
grep-l
打印与模式匹配的文件列表,然后
xargs
为每个
-n1
文件执行
sed
,其中
-i
在适当的位置编辑文件。

这可能适用于您(GNU-sed¶llel):

或者,如果您愿意:

sed -i 's#;*/dev#;/dev#' *.txt
这可能适合您(GNU sed和并行):

或者,如果您愿意:

sed -i 's#;*/dev#;/dev#' *.txt

最简单的方法是调整正则表达式,使其看起来比“/dev/”宽一点,例如

sed -i -E 's|([0-9])/dev|\1;/dev|'
(请注意,我正在利用sed灵活的方法在substitute上使用分隔符。另外,-E更改了组语法)

或者,sed允许您过滤它处理的行:

sed -i '/[0-9]\/dev/ s/\/dev/;/dev/'

这使用了与您已有的相同的替换,但仅应用于与过滤器正则表达式匹配的行。最简单的方法是调整正则表达式,使其看起来比“/dev/”宽一点,例如

sed -i -E 's|([0-9])/dev|\1;/dev|'
(请注意,我正在利用sed灵活的方法在substitute上使用分隔符。另外,-E更改了组语法)

或者,sed允许您过滤它处理的行:

sed -i '/[0-9]\/dev/ s/\/dev/;/dev/'

这使用了与您已经使用的相同的替换,但仅应用于与筛选器正则表达式匹配的行

您好,我只想添加
/dev/
之前,我对date@Ezzmazz,当然现在更改了,请让我知道如果有任何疑问,请。@Ezzmazz,我现在也添加了single
sed
解决方案,您不需要为它使用for-loop,我用GNU-sed中的几个文件对它进行了测试,它对我很好。您好,我只想添加
/dev/
之前,我对date@Ezzmazz,当然现在更改了,请让我知道是否有任何疑问。@Ezzmazz,我现在也添加了单个
sed
解决方案,您不需要为它使用for循环,我已经用GNU sed中的几个文件对它进行了测试,它对我很好。您好,当我尝试您循环时,我有一个错误“sed:can't read 2019-10-28-18-00;/dev/XXXX;3584.00;2743.57;/var/opt/”@Ezzmazz,这意味着还没有这样的文件(用于就地编辑)。
$i
下的文件应该存在。您好,当我尝试您循环时,我出现以下错误:“sed:cannotread2019-10-28-18-00;/dev/XXXX;3584.00;2743.57;/var/opt/”@Ezzmazz,这意味着还没有这样的文件(用于就地编辑)。
$i
下的文件应该存在。
$i>$i
是危险的。对于较小的文件,它可能会起作用,但对于较大的文件,最终可能会导致文件损坏。使用
海绵
清洁buf