如何在BASH中查找和替换文件每行中模式的第一个匹配项?

如何在BASH中查找和替换文件每行中模式的第一个匹配项?,bash,awk,sed,Bash,Awk,Sed,我需要在文件的每一行中查找第一次出现的,,并将其替换为1,,例如: 0001,mountain,a big rock 0002,tree,a tall plant 0003,whale,a big fish 0004,lion,a big cat 0005,iPhone,a small computer 输出如下所示: 00011,mountain,a big rock 00021,tree,a tall plant 00031,whale,a big fish 00041,lion,a bi

我需要在文件的每一行中查找第一次出现的
,并将其替换为
1,
,例如:

0001,mountain,a big rock
0002,tree,a tall plant
0003,whale,a big fish
0004,lion,a big cat
0005,iPhone,a small computer
输出如下所示:

00011,mountain,a big rock
00021,tree,a tall plant
00031,whale,a big fish
00041,lion,a big cat
00051,iPhone,a small computer
我所知道的唯一解决方案是使用while循环,这对长文件来说需要很长时间:

while read -r line
do
    sed -i 's/,/1,/' file.csv
done < file.csv
读取时-r行
做
sed-i's/,/1,/'file.csv
完成

如何在文件中的每一行上查找并替换模式的第一个匹配项?

循环是不必要的。只需在不使用循环的情况下运行sed命令,它将一次性处理整个文件

sed -i 's/,/1,/' file.csv

循环是不必要的。只需在不使用循环的情况下运行sed命令,它将一次性处理整个文件

sed -i 's/,/1,/' file.csv

您可以在纯Bash中使用以下工具完成此操作:

new_lines=()
while IFS= read -r line || [[ $line ]] ; do
    new_lines+=( "${line/,/1,}" )
done <file.csv
printf '%s\n' "${new_lines[@]}" >file.csv

您可以在纯Bash中使用以下工具完成此操作:

new_lines=()
while IFS= read -r line || [[ $line ]] ; do
    new_lines+=( "${line/,/1,}" )
done <file.csv
printf '%s\n' "${new_lines[@]}" >file.csv

你也可以通过awk来做到这一点

$ awk '{sub(/,/,"1,")}1' file
00011,mountain,a big rock
00021,tree,a tall plant
00031,whale,a big fish
00041,lion,a big cat
00051,iPhone,a small computer

你也可以通过awk来做到这一点

$ awk '{sub(/,/,"1,")}1' file
00011,mountain,a big rock
00021,tree,a tall plant
00031,whale,a big fish
00041,lion,a big cat
00051,iPhone,a small computer
既然要编辑文件,为什么不使用标准编辑器
ed

ed -s file < <(printf '%s\n' ',s/,/1,/' 'wq')
既然要编辑文件,为什么不使用标准编辑器
ed

ed -s file < <(printf '%s\n' ',s/,/1,/' 'wq')

你的while循环毫无意义。这完全没有必要。只要使用sed命令,while循环就没有意义了。这完全没有必要。只需使用sed命令。