使用sed替换一些带小写字符的大写字符

时间:2017-09-11 07:47:37

标签: bash awk sed

我有一个名为file.txt的文件,其中包含绝对路径。它看起来像是:

J:/Folder/inner
J:/Folder/inner2

首先,我想编写一个用J:/取代/cygdrive/j/的bash脚本。所以我这样做了:

sed -i 's/J:\//\/cygdrive\/j\//g' file.txt                    

它按预期工作。
但现在我想要更复杂的东西:绝对路径不必从J开始 - 它们可以从CDE开始......
我想做与上面相同的事情,只是因为我不知道第一个字母是什么。例如:C:/Folder/inner将变为/cygdrive/c/Folder/innerD:/Folder/inner将变为/cygdrive/d/Folder/inner
我知道我需要使用正则表达式来实现这一点,但我还没有找到这样做的方法。你知道我怎么能得到我想要的东西吗?

2 个答案:

答案 0 :(得分:4)

我会使用String url = "https://westus.api.cognitive.microsoft.com/face/v1.0/detect"; HttpClient httpclient = new DefaultHttpClient(); HttpPost request = new HttpPost(url); request.setHeader("Content-Type", "application/octet-stream") request.setHeader("Ocp-Apim-Subscription-Key", "{subscription key}"); // Convert Bitmap to InputStream Bitmap photo = (Bitmap) data.getExtras().get("data"); ByteArrayOutputStream baos = new ByteArrayOutputStream(); photo.compress(Bitmap.CompressFormat.JPEG, 100, baos); InputStream photoInputStream = new ByteArrayInputStream(baos.toByteArray()); // Use Bitmap InputStream to pass the image as binary data InputStreamEntity reqEntity = new InputStreamEntity(photoInputStream, -1); reqEntity.setContentType("image/jpeg"); reqEntity.setChunked(true); request.setEntity(reqEntity); HttpResponse response = httpclient.execute(request); 来解决此问题,使用Awk进行小写转换,并使用设置为tolower()的字段分隔符打印其余字段

:

这基本上意味着在将awk -F: '{print "/cygdrive/"tolower($1)""$2}' file.txt 下限($1)之后打印J值并在其后附加$2(其余字符串)。 ""只表示没有任何字符的空字符串。你也可以删除它们。

一旦发现名称被正确替换,请更改源文件本身

awk -F: '{print "/cygdrive/"tolower($1)""$2}' file.txt > temp && mv temp file.txt

如下所示的示例文件

J:/Folder/inner
J:/Folder/inner2
C:/Folder/inner
D:/Folder/inner

该命令生成输出文件

/cygdrive/j/Folder/inner
/cygdrive/j/Folder/inner2
/cygdrive/c/Folder/inner
/cygdrive/d/Folder/inner

perl中的另一个变种,如果你安装了它,

perl -lne 'print "/cygdrive/\L$1$2" if /(.):(.+)/' file.txt

答案 1 :(得分:4)

要使用sed执行此操作,您需要支持更改GNU sed提供的案例。所以,这不是一个便携式解决方案

$ cat file.txt 
J:/Folder/inner
J:/Folder/inner2
C:/Folder/inner
D:/Folder/inner

$ sed -E 's#^(.):#/cygdrive/\l\1#' file.txt 
/cygdrive/j/Folder/inner
/cygdrive/j/Folder/inner2
/cygdrive/c/Folder/inner
/cygdrive/d/Folder/inner
  • -E启用ERE,在这种情况下避免必须逃避()
    • 某些版本可能仅支持-r而非-E
  • ^(.):匹配一个字符,并从行首开始:
    • 根据需要使用^([A-Z]):^([A-Za-z]):仅匹配字母
  • 替换部分中的
  • /cygdrive/\l\1,将使用字符串/cygdrive/和捕获字符的小写版本
  • 注意使用#作为分隔符,有助于避免在搜索/替换部分中转义/
    • 可以使用除\和换行符之外的任何字符
  • 在解决方案按预期工作后添加-i