Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 使用Shell从字符串中间删除第n个字符_Bash_Sed - Fatal编程技术网

Bash 使用Shell从字符串中间删除第n个字符

Bash 使用Shell从字符串中间删除第n个字符,bash,sed,Bash,Sed,我一直在搜索谷歌,但我找不到一个例子来说明如何做到这一点。我也不知道如何为SED构造正则表达式,所以我希望有人能给我解释一下 我正在对一个文件运行bash脚本,该文件中有一行文字,如下所示:2222,H,73.82,04,072012 我需要让它们都像这样:2222,H,73.8204072012 我需要删除最后两个逗号,即行中的第16和第19个字符。 有人能告诉我怎么做吗?我打算使用colrm,这非常简单,但我似乎无法在CYGWIN中安装它。请,谢谢 我会用这个: sed -e 's/(..)

我一直在搜索谷歌,但我找不到一个例子来说明如何做到这一点。我也不知道如何为SED构造正则表达式,所以我希望有人能给我解释一下

我正在对一个文件运行bash脚本,该文件中有一行文字,如下所示:2222,H,73.82,04,072012

我需要让它们都像这样:2222,H,73.8204072012

我需要删除最后两个逗号,即行中的第16和第19个字符。 有人能告诉我怎么做吗?我打算使用colrm,这非常简单,但我似乎无法在CYGWIN中安装它。请,谢谢

我会用这个:

sed -e 's/(..),(..),(....)$/\1\2\3/' myfile.txt
awk -F',' -v OFS=',' '{ print $1, $2, $3, $4$5$6 }' inputfile
这将获取一个CSV文件并打印第一、第二和第三个字段,每个字段后跟输出字段分隔符(
“,“
”),然后将第四、第五和第六个字段连接起来

就我个人而言,我发现这比sed中基于正则表达式的解决方案更易于阅读和维护,如果您的任何一列变得更宽(或更窄!),这将很好地解决问题。

我将使用以下方法:

awk -F',' -v OFS=',' '{ print $1, $2, $3, $4$5$6 }' inputfile
这将获取一个CSV文件并打印第一、第二和第三个字段,每个字段后跟输出字段分隔符(
“,“
”),然后将第四、第五和第六个字段连接起来


就我个人而言,我发现这比sed中基于正则表达式的解决方案更易于阅读和维护,如果您的任何列变宽(或变窄!),它将很好地处理。

这将适用于任何字符串,并且只删除最后2个逗号:

sed -e 's/\(.*\),\([^,]*\),\([^,]*\)$/\1\2\3/' infile.txt

请注意,在我的sed变体中,我必须转义括号YMMV。

这将适用于任何字符串,并且只删除最后2个逗号:

sed -e 's/\(.*\),\([^,]*\),\([^,]*\)$/\1\2\3/' infile.txt
注意,在我的sed变体中,我必须转义括号YMMV。

它应该可以工作:

sed -e 's~,~~4g' file.txt sed-e's~,~~4g'file.txt 删除第四个和下一个逗号

应该可以:

sed -e 's~,~~4g' file.txt sed-e's~,~~4g'file.txt 删除第四个和下一个逗号

我也没有掌握如何构造正则表达式的概念 SED的表达式,所以我希望有人能给我解释一下

人们在这里告诉你的基本符号是:
s/PATTERN/REPLACEMENT/

您的模式是一个正则表达式,其中可能包含括号中的部分。然后可以在命令的替换部分中引用这些部分。例如:

> echo "aabbcc" | sed 's/\(..\)\(..\)\(..\)/\2\3\1/'
bbccaa
请注意,在sed版本中,我使用的默认值是“basic”RE方言,表达式中的括号需要转义。您可以用“扩展”方言做同样的事情:

(在GNU sed中(您可以在Linux中找到),您可以使用
-r
选项而不是
-E
获得相同的结果。我使用的是OS X。)

我应该说,对于你的任务,我一定会听从约翰西韦布的建议,使用awk而不是sed。更容易理解。:)

我也没有掌握如何构造正则表达式的概念 SED的表达式,所以我希望有人能给我解释一下

人们在这里告诉你的基本符号是:
s/PATTERN/REPLACEMENT/

您的模式是一个正则表达式,其中可能包含括号中的部分。然后可以在命令的替换部分中引用这些部分。例如:

> echo "aabbcc" | sed 's/\(..\)\(..\)\(..\)/\2\3\1/'
bbccaa
请注意,在sed版本中,我使用的默认值是“basic”RE方言,表达式中的括号需要转义。您可以用“扩展”方言做同样的事情:

(在GNU sed中(您可以在Linux中找到),您可以使用
-r
选项而不是
-E
获得相同的结果。我使用的是OS X。)

我应该说,对于你的任务,我一定会听从约翰西韦布的建议,使用awk而不是sed。更容易理解。:)

拿15个,丢一个,拿2个,丢一个


取15个字符,删除一个,取2个,删除一个。

您不需要为文件的每一行重新定义OFS:
awk-F,-v OFS=,“{print…}”
您不需要为文件的每一行重新定义OFS:
awk-F,-v OFS=,“{print…}”
可能更容易理解为
s/,/4g
可能更容易理解为
s/,//4g