我有一个名为file.txt
的文件,其中包含绝对路径。它看起来像是:
J:/Folder/inner
J:/Folder/inner2
首先,我想编写一个用J:/
取代/cygdrive/j/
的bash脚本。所以我这样做了:
sed -i 's/J:\//\/cygdrive\/j\//g' file.txt
它按预期工作。
但现在我想要更复杂的东西:绝对路径不必从J
开始 - 它们可以从C
,D
,E
开始......
我想做与上面相同的事情,只是因为我不知道第一个字母是什么。例如:C:/Folder/inner
将变为/cygdrive/c/Folder/inner
,D:/Folder/inner
将变为/cygdrive/d/Folder/inner
。
我知道我需要使用正则表达式来实现这一点,但我还没有找到这样做的方法。你知道我怎么能得到我想要的东西吗?
答案 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